Попытка получить самое высокое и самое низкое значение из массива, который, как я знаю, будет содержать только целые числа, кажется труднее, чем я думал.
var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)
Я ожидаю, что это покажет 99, 104, 140000
. Вместо этого это показывает 104, 140000, 99
. Так что, похоже, сортировка обрабатывает значения как строки.
Есть ли способ заставить функцию сортировки фактически сортировать по целому значению?
javascript
arrays
sorting
numbers
peirix
источник
источник
NaN
. Было бы неплохо увидеть высокопоставленный ответ, который касаетсяNaN
.Ответы:
По умолчанию метод сортировки сортирует элементы по алфавиту. Для числовой сортировки просто добавьте новый метод, который обрабатывает числовые сортировки (sortNumber, показанный ниже) -
В ES6 вы можете упростить это с помощью функций стрелок:
Документация:
Mozilla
Array.prototype.sort()
рекомендует эту функцию сравнения для массивов, которые не содержат Infinity или NaN. (Потому чтоInf - Inf
это NaN, а не 0).Также приведены примеры сортировки объектов по ключу.
источник
numberArray.sort((a, b) => (a - b));
Ура! Я думаю, что это близко к стандартному способу. Примечание: проверьте, поддерживает ли ваш движок JS функции стрелок.Просто опираясь на все приведенные выше ответы, они также могут быть выполнены в одну строку, например:
источник
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
. Или более компактно, в ES6let arr = [140000, 104, 99].sort((a,b) => a-b);
function
иreturn
, но на самом деле не используете истинную цель передачи функции стрелкиthis
. Этот код подразумевает, чтоthis
происходит передача контекста, но это не так. Запутывает других разработчиков, чтобы прочитать ваш код, просто чтобы сохранить несколько символов. Не зависит от побочных эффектов - код с целью!this
в функцию, но это не так. На самом деле он игнорирует создание переменных athis
и,arguments
которые обычно перезаписывают родительские переменные. Единственная причина, которую вы можете использоватьthis
внутри функции стрелки - это лексическая область видимости.array.sort выполняет лексикографическую сортировку по умолчанию, для числовой сортировки предоставляет собственную функцию. Вот простой пример:
Также обратите внимание, что сортировка работает «на месте», нет необходимости в назначении.
источник
Этот ответ эквивалентен некоторым из существующих ответов, но функции стрелок ECMAScript 6 предоставляют гораздо более компактный синтаксис, который позволяет нам определять встроенную функцию сортировки, не жертвуя удобочитаемостью:
Это поддерживается в большинстве браузеров сегодня .
источник
objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);
и если свойство является строкой, которую вы можете сделать:objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty));
сказанное выше, этот вопрос специально задает вопрос о сортировке массива целых чиселЯ удивлен, почему все рекомендуют передавать функцию сравнения
sort()
, которая делает сортировку очень медленной!Чтобы отсортировать числа, просто создайте любой TypedArray :
источник
Причина, почему функция сортировки ведет себя так странно
Из документации :
Если вы распечатаете значения точек Unicode в массиве, это станет ясно.
Возвращает: «49, 49, 57».
Теперь, поскольку 140000 и 104 вернули одинаковые значения (49), он обрезает первый индекс и проверяет снова:
Если мы отсортируем это, то получим:
поэтому 104 идет раньше 140000.
Итак, окончательный результат будет:
104, 140000, 99
Вывод:
sort()
выполняет сортировку, просматривая только первый индекс чисел.sort()
не заботится о том, что целое число больше другого, оно сравнивает значение юникода цифр, а если есть два равных значения юникода, то проверяет, есть ли следующая цифра, и сравнивает ее.Для правильной сортировки вы должны передать функцию сравнения,
sort()
как описано здесь .источник
Я согласен с Акс, но вместо того, чтобы использовать
Вы должны использовать
источник
>
И<
еще сравнить а и Ь в виде строк.В новом мире ES6 гораздо проще сделать
Это все, что вам нужно :)
источник
В JavaScript поведение метода sort () по умолчанию заключается в сортировке значений в массиве по алфавиту.
Для сортировки по номеру необходимо определить числовую функцию сортировки (что очень просто):
источник
Array.prototype.sort () - это метод go to для сортировки массивов, но нам нужно знать о нескольких проблемах.
Порядок сортировки по умолчанию лексикографический, а не числовой, независимо от типов значений в массиве. Даже если массив состоит из всех чисел, все значения будут преобразованы в строку и отсортированы лексикографически.
Поэтому нам нужно настроить метод sort () и reverse (), как показано ниже.
Ссылочный URL
Для сортировки чисел внутри массива
Для изменения чисел внутри массива
Ссылочный URL
источник
На вопрос уже дан ответ, самый короткий путь - это использование
sort()
метода. Но если вы ищете дополнительные способы сортировки массива чисел, а также любите циклы, проверьте следующееВид вставки
Восходящий:
По убыванию:
Сортировка выбора:
Восходящий:
По убыванию:
Радоваться, веселиться
источник
sort()
TypedArray, как предполагает этот ответ . Конечно, они не будут быстрее для средних и больших массивов, потому что это O (n ^ 2) алгоритмы.Функция «численно», приведенная ниже, служит для сортировки массива чисел во многих случаях, когда она предоставляется в качестве функции обратного вызова:
Но в некоторых редких случаях, когда массив содержит очень большие и отрицательные числа, может возникнуть ошибка переполнения, поскольку в результате значение ab становится меньше наименьшего числа, с которым может справиться JavaScript.
Итак, лучший способ написания числовой функции заключается в следующем:
источник
DBL_MIN - DBL_MAX
), но возможное снижение значения невозможно. Катастрофическое аннулирование делает результат неточным, теряя большинство его «значащих цифр», ноa-b
всегда будет отличным от нуля и будет иметь правильный знак a! = B.для обработки неопределенных, нулевых и NaN: Null ведет себя как 0, NaN и неопределенные идут до конца.
источник
Только для обычного массива значений элементов:
Для массива объектов:
источник
Моя личная любимая форма этой функции позволяет использовать параметр Ascending или Descending:
Использование так просто, как:
jsFiddle
Или пример фрагмента кода здесь!
.smartSort ('asc' | 'desc')
Теперь получайте еще больше удовольствия от метода сортировки, который сортирует массив, состоящий из нескольких элементов! В настоящее время не охватывает «ассоциативный» (иначе, строковые ключи), но он охватывает практически все типы значений! Он не только будет сортировать несколько значений
asc
или,desc
соответственно, но также будет поддерживать постоянную «позицию» «групп» значений. Другими словами; сначала идут int, затем идут строки, затем массивы (да, я делаю это многомерным!), затем объекты (нефильтрованные, элемент, дата) и, наконец, неопределенные и нулевые!"Почему?" ты спрашиваешь. Почему бы нет!
Теперь поставляется в 2 вкусах! Первый из них требует более новых браузеров, поскольку он использует
Object.defineProperty
для добавления метода кArray.protoype
объекту. Это позволяет упростить естественное использование, такие как:myArray.smartSort('a')
. Если вам нужно реализовать для старых браузеров, или вам просто не нравится модифицировать нативные объекты, прокрутите вниз до версии Method Only .jsFiddle Array.prototype.smartSort ('asc | desc')
Использовать просто! Сначала создайте какой-нибудь сумасшедший массив вроде:
Тогда просто сортируйте это!
Только метод
То же, что и предыдущий, за исключением простого метода!
Использование:
Метод jsFiddle smartSort (Массив, "asc | desc")
источник
Попробуйте этот код:
HTML:
Код JavaScript:
источник
Попробуйте этот код, как показано ниже
источник
источник
Хотя это не требуется в JavaScript, если вы хотите, чтобы он строго возвращал -1, 0 или 1 (аналогично тому, как работает оператор космического корабля в PHP), вы можете использовать его .
sort()
compareFunction
Math.sign()
compareFunction
Ниже строго возвращает -1, 0 или 1:источник
Это уже предложенное и принятое решение в качестве метода на прототипе Array:
источник
Метод сортировки преобразует элементы массива в строку. Таким образом, ниже путь также отлично работает с десятичными числами с элементами массива.
И дает вам ожидаемый результат.
источник
Переопределение метода сортировки.
источник
Функция сортировки по умолчанию - сортировка в словаре:
Вышеупомянутый случай не тот, который мы хотим для чисел. Так что если у вас есть целые числа и функция сортировки по умолчанию не работает (потому что она сортируется в словаре), то вам нужно реализовать свою собственную функцию:
Я надеюсь, у вас есть вопрос, как это работает? Здесь, когда мы предоставляем метод в функции сортировки, он передает два числа каждый раз, и если число возвращает
Следуя этому для всех чисел, он сортирует массив целых чисел.
Если вы используете ES6, напишите функцию стрелки:
источник
Вот моя функция сортировки в библиотеке utils:
источник
a-b
следует использовать вместо (Вы можете придумать и сделатьNumber(a>b)-0.5
, но это все еще не стабильный вид).