2015-06-19 3 views
-2

Мне нужно отсортировать nrArray массив:JQuery - Сортировка массива в порядке возрастания

var nrArray = nrArray.sort(); 

Вышеприведенный делает это:

[ "1", "17", "206", " 22" , "3", "6"]

мне это нужно:

[ "1", "3", "6", "17", "22", "206"]

+0

использовать sort() ... и это то, что я сделал. – Ciprian

+0

jQuery не предоставляет никаких функций для сортировки коллекций. –

+0

похоже, что вы сортируете по алфавиту, а ваши элементы массива - это строки, а не целые числа. Преобразуйте их в числа, затем сортируйте. – Brino

ответ

3

Пасс 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, так как это конкатенация строк.

4

Это происходит потому, что по умолчанию метод sort() будет делать сравнение с использованием строкового

compareFunction
факультативных. Определяет функцию, которая определяет порядок сортировки . Если этот параметр опущен, массив сортируется согласно каждому значению кодовой точки символа Unicode в соответствии со строкой преобразования каждого элемента.

var nrArray = ["22", "17", "8", "206", "1", "3", "6"]; 
 

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

 
console.log(nrArray)

+1

'sort', по умолчанию всегда сравнивает строковое представление значений независимо от фактического типа данных. –

+0

@FelixKling да .... только что обновлено ... –

+0

@FelixKling, интересно, ответ Aruns работает без 'parseInt'.Я предполагаю, что это потому, что 'a/b' автоматически преобразуются для выполнения подстановки. Насколько безопасно это поведение в браузерах? – AmmarCSE

1

Прикладной из 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

Да потому, что вашего создать массив строк не число. [1, 17, 206, 22, 3, 6] должны работать нормально. кроме того, не нужно писать

var nrArray = nrArray.sort();

nrArray.sort(); меняет исходный массив

+0

a) Он также не работает с числами. б) Вы говорите, что присвоение возвращаемого значения '.sort' не изменит исходный массив. Это то, что вы имели ввиду? Потому что это неправильно. –

+0

Упс ... мой плохой ..... var nrArray = [40, 100, 1, 5, 25, 10]; nrArray.sort (функция (a, b) {return a-b}); должен работать .. извините, я не проверял перед записью –

Смежные вопросы