Как правильно отсортировать массив целых чисел - PullRequest
704 голосов
/ 30 июня 2009

Попытка получить самое высокое и самое низкое значение из массива, который, как я знаю, будет содержать только целые числа, кажется труднее, чем я думал.

var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)

Я ожидаю, что это покажет 99, 104, 140000. Вместо этого он показывает 104, 140000, 99. Похоже, что сортировка обрабатывает значения как строки.

Есть ли способ заставить функцию сортировки фактически сортировать по целому значению?

Ответы [ 20 ]

1012 голосов
/ 30 июня 2009

По умолчанию метод сортировки сортирует элементы по алфавиту. Для числовой сортировки просто добавьте новый метод, который обрабатывает числовые сортировки (sortNumber, показанный ниже) -

function sortNumber(a, b) {
  return a - b;
}

var numArray = [140000, 104, 99];
numArray.sort(sortNumber);

console.log(numArray);

В ES6 вы можете упростить это с помощью функций стрелок:

numArray.sort((a, b) => a - b); // For ascending sort
numArray.sort((a, b) => b - a); // For descending sort
163 голосов
/ 06 февраля 2014

Просто опираясь на все вышеперечисленные ответы, они также могут быть выполнены в одну строку следующим образом:

var numArray = [140000, 104, 99];

// ES5
numArray = numArray.sort(function (a, b) {  return a - b;  });

// ES2015
numArray = numArray.sort((a, b) => a - b);

//outputs: 99, 104, 140000
70 голосов
/ 30 июня 2009

array.sort выполняет лексикографическую сортировку по умолчанию, для числовой сортировки предоставляет свою собственную функцию. Вот простой пример:

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

numArray.sort(compareNumbers);

Также обратите внимание, что сортировка работает "на месте", в назначении нет необходимости.

36 голосов
/ 03 февраля 2016

Этот ответ эквивалентен некоторым из существующих ответов, но ECMAScript 6 функции стрелок предоставляют гораздо более компактный синтаксис, который позволяет нам определять встроенную функцию сортировки, не жертвуя читабельностью:

numArray = numArray.sort((a, b) => a - b);

Поддерживается в большинстве браузеров сегодня .

17 голосов
/ 26 мая 2018

Причина, по которой функция сортировки ведет себя так странно

Из документации :

[...] массив сортируется в соответствии с кодовой точкой Unicode каждого символа значение в соответствии со строковым преобразованием каждого элемента.

Если вы напечатаете значения точки в юникоде массива, тогда он очистится.

console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

Возвращает: "49, 49, 57".

49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)

Теперь, поскольку 140000 и 104 вернули одинаковые значения (49), он обрезает первый индекс и проверяет снова:

console.log("40000".charCodeAt(0));
console.log("04".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"
52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)

Если мы отсортируем это, то получим:

40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)

, поэтому 104 предшествует 140000.

Итак, окончательный результат будет:

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

104, 140000, 99

Вывод:

sort() выполняет сортировку, просматривая только первый индекс чисел. sort() не заботится о том, что целое число больше другого, оно сравнивает значение юникода цифр, а если есть два равных значения юникода, то проверяет, есть ли следующая цифра, и сравнивает ее.

Для правильной сортировки необходимо передать функцию сравнения в sort(), как объяснено здесь .

16 голосов
/ 18 ноября 2014

Я согласен с aks, однако вместо использования

return a - b;

Вы должны использовать

return a > b ? 1 : a < b ? -1 : 0;
14 голосов
/ 18 ноября 2018

Я удивлен, почему все рекомендуют передавать функцию сравнения в sort(), что делает сортировку действительно медленной!

Чтобы отсортировать числа, просто создайте any TypedArray :

var numArray = new Uint32Array([140000, 104, 99]);
numArray = numArray.sort();
alert(numArray)
10 голосов
/ 30 июня 2009

В JavaScript поведение метода sort () по умолчанию заключается в сортировке значений в массиве по алфавиту.

Для сортировки по номеру вы должны определить числовую функцию сортировки (что очень просто):

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

numArray = numArray.sort(sortNumber);
8 голосов
/ 02 марта 2016

Array.prototype.sort () - это метод перехода к сортировке массивов, но нам нужно знать о нескольких проблемах.

Порядок сортировки по умолчанию лексикографический, а не числовой, независимо от типов значений в массиве. Даже если массив состоит из всех чисел, все значения будут преобразованы в строку и отсортированы лексикографически.

Так что нам нужно настроить метод sort () и reverse (), как показано ниже.

Реферальный URL

Для сортировки чисел внутри массива

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

Для обращения чисел внутри массива

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

Реферальный URL

7 голосов
/ 16 ноября 2018

В новом мире ES6 сделать сортировку намного проще

numArray.sort((a,b) => a-b);

Это все, что вам нужно:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...