Мне нужно отсортировать nrArray
массив:JQuery - Сортировка массива в порядке возрастания
var nrArray = nrArray.sort();
Вышеприведенный делает это:
[ "1", "17", "206", " 22" , "3", "6"]
мне это нужно:
[ "1", "3", "6", "17", "22", "206"]
Мне нужно отсортировать nrArray
массив:JQuery - Сортировка массива в порядке возрастания
var nrArray = nrArray.sort();
Вышеприведенный делает это:
[ "1", "17", "206", " 22" , "3", "6"]
мне это нужно:
[ "1", "3", "6", "17", "22", "206"]
Пасс i п сравнение обратного вызова и использовать parseInt
как
var arr = ["1", "17", "206", "22", "3", "6"];
arr.sort(function(a, b){
return parseInt(a)- parseInt(b);
});
console.log(arr);
Update
Вы на самом деле не нужно parseInt
, как a/b
будут автоматически преобразованы в числа. Это потому, что вы вычитаете, а javascript выполняет необходимое преобразование типов. Однако то же самое нельзя сказать о a + b
, так как это конкатенация строк.
Это происходит потому, что по умолчанию метод sort() будет делать сравнение с использованием строкового
compareFunction
факультативных. Определяет функцию, которая определяет порядок сортировки . Если этот параметр опущен, массив сортируется согласно каждому значению кодовой точки символа Unicode в соответствии со строкой преобразования каждого элемента.
var nrArray = ["22", "17", "8", "206", "1", "3", "6"];
nrArray.sort(function(a, b) {
return a - b;
});
console.log(nrArray)
'sort', по умолчанию всегда сравнивает строковое представление значений независимо от фактического типа данных. –
@FelixKling да .... только что обновлено ... –
@FelixKling, интересно, ответ Aruns работает без 'parseInt'.Я предполагаю, что это потому, что 'a/b' автоматически преобразуются для выполнения подстановки. Насколько безопасно это поведение в браузерах? – AmmarCSE
Прикладной из SO: Sort Array Elements (string with numbers), natural sort
Вам нужен естественный вид. Хороший общий естественный сорт обеспечения сравнения для сортировки, которые будут работать в случае, если строки содержат буквы:
function naturalCompare(a, b) {
var ax = [], bx = [];
a.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
b.replace(/(\d+)|(\D+)/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });
while(ax.length && bx.length) {
var an = ax.shift();
var bn = bx.shift();
var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
if(nn) return nn;
}
return ax.length - bx.length;
}
var nrArray = nrArray.sort(naturalCompare);
Да потому, что вашего создать массив строк не число. [1, 17, 206, 22, 3, 6] должны работать нормально. кроме того, не нужно писать
var nrArray = nrArray.sort();
nrArray.sort(); меняет исходный массив
a) Он также не работает с числами. б) Вы говорите, что присвоение возвращаемого значения '.sort' не изменит исходный массив. Это то, что вы имели ввиду? Потому что это неправильно. –
Упс ... мой плохой ..... var nrArray = [40, 100, 1, 5, 25, 10]; nrArray.sort (функция (a, b) {return a-b}); должен работать .. извините, я не проверял перед записью –
использовать sort() ... и это то, что я сделал. – Ciprian
jQuery не предоставляет никаких функций для сортировки коллекций. –
похоже, что вы сортируете по алфавиту, а ваши элементы массива - это строки, а не целые числа. Преобразуйте их в числа, затем сортируйте. – Brino