2013-12-13 5 views
-3

Вот массив:Как отсортировать массив номеров строк

var price = new Array("600", "250", "750", "400", "200", "500", "350", "800", "200", "700", "800", "700", "1", "800", "500", "25", "0", "1,000,000"); 

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

Люди спрашивали, поэтому я хочу конвертировать их в числа и сортировать от наивысшего до самого низкого.

+1

сортировать как цифры или сортировать как строки? –

+0

Ответил красиво здесь - http://stackoverflow.com/a/1063027/448865 – cpreid

+0

Этот вопрос не заслуживает всех этих downvotes.Собственная функция сортировки JavaScript не сортирует массивы «целых чисел», как можно было бы ожидать. Это не тривиальный вопрос. – cpreid

ответ

2

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

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

Это будет сортировать массив в возрастающей моде (b-a для убывания). Обратите внимание, что это также изменит порядок исходного массива.

Изменения в a.replace(/,/g,"") - b.replace(/,/g,"") игнорировать запятые в число сравнений

Update Если вы решили, что список может быть сочетание чисел или строк, которые вы можете захотеть изменить выше String(a).replace(/,/g,"") - String(b).replace(/,/g,"") избежать ошибки синтаксиса. Как вы обрабатываете не числовые строки, до вас прямо сейчас они сделаны NaN, что не является полезным значением для сортировки.

+0

Это умно, но это немного вводит в заблуждение, и я не уверен на 100%, что он будет работать на всех браузерах. – Ariel

+0

Работает в каждом браузере, о котором я могу думать, начиная с ie6 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#AutoCompatibilityTable – megawac

+0

Это вообще не вводит в заблуждение. Оператор '-' ВСЕГДА преобразует оба операнда в числа. – Tibos

-2

Отправьте свой индивидуальный компаратор при сортировке массива.

price.sort(function(a, b) { 
// write your custom comparison here 
}) 
+1

Я '-1''d это, как [Ариэль] (http://stackoverflow.com/a/20571930/1454048) и [ megawac] (http://stackoverflow.com/a/20571860/1454048), ответы включали фактическую инструкцию компаратора. – admdrew

2

Если номера всегда INTS вы можете сделать следующее:

price.sort(function(a, b) { 
    return parseInt(a.replace(/,/g,'') - parseInt(b.replace(/,/g,''))); 
}); 

Это будет сортировать исходный массив по значению числа в порядке возрастания (наименьший первый). Вы можете отменить его путем замены a и b

+0

Если они должны быть отсортированы как целые числа, вы, вероятно, захотите удалить запятые перед их анализом. – Chris

+0

Хорошая точка @Rfvgyhn. Я обновил код. – Ariel

+0

Возможно, вы захотите добавить основание для 'parseInt' – megawac

1

Единственная действительно сложная часть здесь - запятые в 1,000,000. Вам нужно будет удалить их, прежде чем пытаться сравнить числа.

price.sort(function(x, y) { 
    return y.replace(/,/g,'') - x.replace(/,/g,''); 
}); 

Это произведет

["1,000,000", "800", "800", "800", "750", 
"700", "700", "600", "500", "500", "400", 
"350", "250", "200", "200", "25", "1", "0"] 

Или, возможно, преобразовать элементы чисел, а затем отсортировать результаты:

price = price.map(function(x) { return parseInt(x.replace(/,/g,''),10) }) 
      .sort(function(x, y) { return y - x; }); 

Это произведет

[1000000, 800, 800, 800, 750, 700, 700, 600, 
500, 500, 400, 350, 250, 200, 200, 25, 1, 0] 

Примечание: Array.prototype.map был представлен в ECMAScript 5, поэтому он недоступен в некоторых старых браузерах. Если это вызывает беспокойство, альтернативой является использование обычного цикла for для преобразования массива.

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