Как отсортировать массив с повторяющимися значениями, используя Array.prototype.sort ()? - PullRequest
3 голосов
/ 02 мая 2019

Я хочу отсортировать массив с повторяющимися значениями, используя Array.prototype.sort () .

Например, если я выполню этот [1, 2, 0, 1].sort((a, b) => a + b), чтобы получить отсортированный массив в порядке убывания, я вернусь обратно в тот же массив [1, 2, 0, 1].

Почему это происходит и как я могу отсортировать этот массив, используя Array.prototype.sort? Является ли сортировка по массиву в javascript ненадежной для сортировки повторяющихся значений, или я предоставляю функцию, которая не выполняет правильные сравнения? Я хотел бы добиться этого, используя Array.prototype.sort, и мне не нужно писать собственную функцию сортировки.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 мая 2019

Вам нужно вычесть два значения.

//ascending order
console.log([1, 2, 0, 1].sort((a, b) => a - b))

//descending order
console.log([1, 2, 0, 1].sort((a, b) => b - a))
0 голосов
/ 02 мая 2019

Причина, по которой он не работает:

Если вы посмотрите официальную документацию MDN ,

Метод sort () сортирует элементы массива на месте и возвращает массив. Порядок сортировки по умолчанию строится после преобразования элементы в строки, затем он сравнивает массив.

var months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]

var array1 = [1, 2, 0, 1];
array1.sort((a, b) => a + b);
console.log(array1);
// expected output: Array [1, 2, 0 ,1]

Итак, чтобы сравнивать числа вместо строк, функция сравнения может просто вычесть б из а. Следующая функция будет сортировать массив по возрастанию (если он не содержит бесконечность и NaN)

function compareNumbers(a, b) {
  return a - b;
}
...