2014-01-21 2 views
4
var a = ['a100', 'a1', 'a10']; 
a.sort(); 

Это журналы: ["a1", "a10", "a100"]Объясните сортировку в JavaScript

var a = ['f_a100_', 'f_a1_', 'f_a10_']; 
a.sort(); 

Но это журналы: ["f_a100_", "f_a10_", "f_a1_"]

Можете ли вы посоветовать мне, почему это?

+4

Потому что это строка сортировки ... – epascarello

+1

ее либо колдовство, либо колдовство, но определенно не оба – Rooster

+1

Конечно, но нет никакой разницы, кроме префикса ... В каждом примере это сортировка по умолчанию по умолчанию. – gazdac

ответ

4

Array.sort сортирует значение пути преобразования элемента в строку, а затем делать лексикографический вид.

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

f_a100_ 
    ^
f_a1_ 
    ^
f_a10_ 
    ^

Просмотреть первый несимметричный символ. Здесь _ больше 0 (проверьте их коды ascii), поэтому f_a100_ и f_a10_ выше f_a1_. В настоящее время между этими двумя мы идем к следующему символу

f_a100_ 
    ^
f_a10_ 
    ^

Здесь, применяя ту же логику f_a100_ приходит первым. Таким образом, окончательный заказ ["f_a100_", "f_a10_", "f_a1_"]

Этот порядок сортировки представляется логичным для простых строк. Но для некоторых других случаев, подобных вашим, это работает странно из-за того, как упорядочены кодировки. Чтобы получить желаемое поведение, вы должны написать свою собственную функцию сравнения, которая удаляет номерную часть и возвращает положительное, отрицательное значение или значение 0, как показано в примере.

0

javascriptsort функция делает сортировку буквенно-цифровым способом не арифметически, поэтому вы получаете такие результаты. Смотрите этот вопрос, что почти то же самое с вашими Array Sort in JS

1

Javascript сортировка основана строка:

var a = ['a100', 'a1', 'a10']; 
a.sort(); 

Вернется:

["a1", "a10", "a100"] 

Из сравнения строк: "a1" < "a10" < "a100". В другом примере "f_a100_" < "f_a10_", потому что "0" < "_" и "f_a10_" < "f_a1_" по той же причине.

Действительно, это:

[15, 13, 8].sort(); 

вернется:

[13, 15, 8] 

Это что-то немного странно, но это, как он предназначен. Если вы хотите изменить критерии заказа, вы можете передать функцию в качестве параметра. Например. (Из here)

var points = [40,100,1,5,25,10]; 
points.sort(function(a,b){return a-b}); 
+0

«Это что-то странное», ... определить странное :). – Dalorzo

+0

Ребята, tnx, я знаю все это, но я пропустил суффиксный знак подчеркивания, как я уже говорил. Я действительно устал, поэтому я очень рад, что кто-то заметил это :) – gazdac

+0

@ Dalorzo: Хе-хе "странно", возможно, не лучшее слово, но ... Я ожидаю, что интерпретатор сможет «обнаружить», это массив целые числа и использовали соответствующую функцию сравнения, например Ruby. Но я могу жить с этим. –

0

В первом случае «a1» < «a10», потому что при сравнении двух строк часть «a1» соответствует, но затем она решает, что «a1» имеет более короткую длину.

Но во втором случае «f_a1_»> «f_a10_», потому что при сравнении этих двух частей «f_a1» соответствует, а затем «_» сравнивается с «0». И '_'> '0', потому что они сравниваются по их значению ascii.

0

Array.sort использует сортировку строк (даже если массив представляет собой список чисел).

Сортировка, которую вы ищете, известна как натуральный заказ сортировка. В этих сортировочных номерах рассматриваются как числа, 100 - после 10, 2 - до 10 и т. Д.

В JavaScript не имеется natsrt. Я написал свою собственную реализацию, но это очень важно. Вот эталонная реализация: http://phpjs.org/functions/strnatcmp/

Если вам просто нужно отсортировать строки формы f_a[0-9]+_, вы можете написать регулярное выражение, чтобы извлечь номер.

+0

Я не ищу его, просто хотел знать, почему это отсортировано так, как будто это :) Но спасибо в любом случае – gazdac

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