2014-12-06 3 views
1

Я пытаюсь понять фрагмент JS кода, который получает числовой массив и сортирует его:Сортировка числовых массивов в JavaScript

var msg = document.getElementById("message"); 

var v = [30,2,1,9,15]; 
msg.innerHTML += "<p><strong>Original order:</strong> [" + v + "]<p>"; 

v.sort(sortLowToHigh); 
msg.innerHTML += "<p><strong>After sorting:</strong> [" + v + "]<p>"; 

function sortLowToHigh(a, b) { 
    return a - b; 
} 

Выход:

Original order: [30,2,1,9,15] 

After sorting: [1,2,9,15,30] 

Я понимаю, что это много, что функция sort(), когда используется одна, преобразует элементы массива в строки, и результат этой сортировки будет нежелательным.

Но я не знаю, как и на основе какого процесса sortLowToHigh обучает метод sort при сортировке числовых значений в порядке возрастания.

ответ

3

Когда вы даете sort функцию (называется компаратор) sort не делает никаких предположений относительно значений (или преобразовать их к чему-либо) вообще. Он просто вызывает функцию, которую вы даете ей повторно, чтобы сравнить пары элементов (назовите их и b) и использует возвращаемое значение функции, чтобы определить, как упорядочить эти два элемента в результате: если это 0, a и b равны; если он положительный, b должен наступить после a (например, b «больше чем» a); если он отрицательный, b должны прийти до a (например, b «меньше, чем a). Таким образом, путем вычитания a из b, то sortLowToHigh возвращает соответствующие значения.

Поведение новообращенного к строке вы упоминаете применяется только тогда, когда вы не дают sort компаратор использовать.

Это накрыты (в напыщенной прозе) по §15.4.4.11 из спецификации.

Порядок вызовов на компаратор полностью вплоть до реализации, а различные реализации могут использовать разные алгоритмы сортировки, поэтому некоторые механизмы JavaScript могут вызывать компаратор больше или меньше или в другом порядке по сравнению с другими. Например, с учетом этого:

var v = [30,2,1,9,15]; 
 
v.sort(function(a, b) { 
 
    snippet.log("a = " + a + ", b = " + b); 
 
}); 
 
snippet.log(v.join(", "));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Текущая версия выходов Chrome:

 
a = 30, b = 2 
a = 2, b = 1 
a = 1, b = 9 
a = 9, b = 15 
30, 2, 1, 9, 15 

...но текущая версия Firefox выходов

 
a = 30, b = 2 
a = 2, b = 1 
a = 9, b = 15 
a = 1, b = 9 
30, 2, 1, 9, 15 

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

4

sort принимает функцию сравнения. Все, что нужно сделать, это сравнить два значения и вернуть значение меньше 0, если a считается меньше b, больше 0, если a больше b, или 0, если они равны. Используя это сравнение, функция сортировки обрабатывает фактическую сортировку.

Для чисел эта функция сравнения проста. Вы просто возвращаете a - b, и вы получили свое возвращаемое значение <0, 0 или >0.

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