Come ordinare i voti in lettere in Javascript senza un indice manuale




sorting (5)

Cercando di capire come ordinare correttamente una serie di gradi lettera ['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'F'] . La funzione di ordinamento standard non lo fa. Sto anche cercando di farlo senza impostare un indice manuale per ogni lettera.

const grades = ['B+', 'F', 'A-', 'A+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'A']

grades.sort((a, b) => {
    return a - b;
});

console.log(grades);

Uscita prevista:

['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'F']


È possibile separare i voti e prendere un oggetto per i simboli postfix.

const grades = ['B+', 'A', 'A-', 'A+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'F']

grades.sort((a, b) => {
    const order = { '+': -1, '-': 1, undefined: 0 };
    return a[0].localeCompare(b[0]) || order[a[1]] - order[b[1]];
});

console.log(...grades);


Ecco la mia soluzione usando la matematica semplice 🧮:

const grades = ['B+', 'F', 'A-', 'A+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'A']

const getCounter = (letter) => {
  // Making simple math to sort it out
  let letterCounter = letter.charCodeAt(0) * 10;
  if(letter[1] === "+"){
    letterCounter -= 1;
  }
  else if(letter[1] === "-"){
    letterCounter += 1;
  }
  return letterCounter;
}

grades.sort((a, b) => {
  return getCounter(a) - getCounter(b);
});

console.log(grades)
// Print => ['A+','A','A-','B+','B','B-','C+','C','C-','D+','D','D-','F']


Pochi modi per farlo. Un modo è dividere i personaggi e confrontare le parti.

const grades = ['B+', 'A', 'A-', 'A+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'F']
const sorted = grades.sort((a, b) => {
  if (a === b) return 0 // if equal nothing changes
  const ap = a.split('') // separate into letter and sign
  const bp = b.split('')
  if (ap[0] === bp[0]) { // if first letter is the same, we have to check second
    return (ap[1] === "+" || b[1] === "-") ? -1 : 1
  }
  return ap[0].localeCompare(b[0]) // sort by letter grade
})
console.log(sorted)


Prova questo.

const grades = ['B+', 'A', 'A-', 'A+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'F']
const sortGrades = function (grades) {
    const result = grades.sort(function (a, b) {
        if (a[0] < b[0]) {
            return -1;
        }
        if (b[0] > a[0]) {
            return 1;
        }
        if(a[0] === b[0]) {
            if(a[1] && a[1] === "+") {
                return -1;
            }
        }
        return 0;
    });
        return result;
    };
sortGrades(grades)

puoi provare qualcosa del tipo:


const symbols = ['+', undefined, '-']

function sort(a, b) {
  if (a[0] !== b[0]) return a > b ? 1 : -1
  return symbols.indexOf(a[1]) > symbols.indexOf(b[1]) ? 1 : -1
}

controlla prima la lettera, quindi il modificatore (se presente)





sorting