Статьи

Сортировка JavaScript Массив Сортировка

Рассмотрим следующий код JavaScript:

var a = [30,2,1,9,15];a.sort();alert(a); 

Что будет выходным? Если вы ожидаете 1,2,9,15,30, вы будете удивлены, узнав, что фактический результат составляет 1,15,2,30,9. Пока не отказывайтесь от JavaScript; Сортировка массивов становится невероятно мощной, если вы знаете, как ее использовать. Так что же происходит? Когда в метод сортировки ничего не передается, каждое значение преобразуется в строку и сортируется в лексикографическом порядке, то есть «15» будет стоять перед «2». Так же как и «10» и «19999999». Чтобы решить проблему, нам нужно передать функцию сравнения в метод sort (). Функция должна принимать 2 параметра — мы назовем их a и b — и вернем:

  • значение меньше нуля, если а меньше, чем b
  • значение больше нуля, если а больше, чем b
  • ноль, если а и б равны

Поэтому самая простая числовая функция сравнения:

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

Мы можем передать функцию сравнения в качестве аргумента для метода сортировки или записать его в строку, например

 var a = [30,2,1,9,15];a.sort(function(a,b) { return ab; });alert(a); 

Вывод теперь гораздо более логичен 1,2,9,15,30. Одним из замечательных моментов JavaScript является то, что наши функции сравнения могут сортировать объекты любого типа по любому свойству. Например, мы определим список местоположений и домашних координат:

 // location co-ordinatesvar locations = [ { name: "shops", x:3, y:4 }, { name: "library", x:5, y:3 }, { name: "pub", x:1, y:2 }];// home co-ordinatesvar home = { name: "home", x:0, y:0 }; 

Далее мы добавим немного Пифагора к функции, которая вычисляет расстояние между двумя точками:

 // distance between 2 co-ordinatesfunction distance(p1, p2) { return Math.sqrt(Math.pow(p1.x-p2.x,2)+Math.pow(p1.y-p2.y,2));} 

Теперь мы можем отсортировать места по расстоянию от дома — от кратчайшего до самого дальнего пути:

 // sort by shortest distance homelocations.sort( function(a, b) { return distance(home,a)-distance(home,b); });// locations sorted: pub, shops, library 

Или мы могли бы отсортировать расстояние от самого дальнего до самого короткого путем изменения параметров:

 // sort by furthest distance homelocations.sort( function(b, a) { return distance(home,a)-distance(home,b); });// locations sorted: library, shops, pub 

Или мы можем заказать названия мест в алфавитном порядке:

 locations.sort( function(a, b) { if (a.name < b.name) return -1; if (a.name > b.name) return 1; return 0; });// locations sorted: library, pub, shops 

Легко разработать ряд повторно используемых функций сортировки, которые можно применять к любому объекту, содержащему похожие имена свойств. В этом отношении сортировка JavaScript проще и гибче, чем во многих других языках.

примечание: хотите больше?

Если вы хотите узнать больше от Крейга, подпишитесь на нашу еженедельную новостную рассылку Tech Times .