Рассмотрим следующий код 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 .