2013-02-28 4 views
141

В настоящее время я использую underscorejs для сортировки сортировки json. Теперь я попросил сделать сортировку ascending и descending, используя underscore.js. Я не вижу ничего подобного в документации. Как я могу это достичь?Как я могу сортировать asc и desc, используя underscore.js?

+1

Пожалуйста, добавьте пример того, что вы сортируете и как. – Jon

+0

Что вы сортируете? Числа? Строки? Сроки? Что-то другое? –

+0

@muistooshort Я сортирую массив объектов. Поэтому метод sortBy отлично подходит для моих критериев для восходящего сортировки, но не наоборот. – Rahul

ответ

318

Вы можете использовать .sortBy, он всегда будет возвращать восходящий список:

_.sortBy([2, 3, 1], function(num) { 
    return num; 
}); // [1, 2, 3] 

Но вы можете использовать метод .reverse, чтобы получить его убыванию:

var array = _.sortBy([2, 3, 1], function(num) { 
    return num; 
}); 

console.log(array); // [1, 2, 3] 
console.log(array.reverse()); // [3, 2, 1] 

Или когда дело с цифрами добавить отрицательный знак к возврату, чтобы перейти из списка:

_.sortBy([-3, -2, 2, 3, 1, 0, -1], function(num) { 
    return -num; 
}); // [3, 2, 1, 0, -1, -2, -3] 

Под капотом .sortBy использует встроенный в .sort([handler]):

// Default is ascending: 
[2, 3, 1].sort(); // [1, 2, 3] 

// But can be descending if you provide a sort handler: 
[2, 3, 1].sort(function(a, b) { 
    // a = current item in array 
    // b = next item in array 
    return b - a; 
}); 
+9

Последнее решение, то есть добавление замедленного знака в возвращаемое число, является совершенным. – vinesh

+0

Почему вы думаете, что это пузырь? Под капотом '.sortBy()' вызывает встроенный 'Array.sort()', алгоритм которого зависит от поставщиков браузеров, но выбор пузырьков вряд ли будет их выбором. –

+0

Разве это не увеличивает временную сложность? Это приводит к сортировке списка дважды. – user1477388

46

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

//Ascending Order: 
_.sortBy([2, 3, 1], function(num){ 
    return num; 
}); // [1, 2, 3] 


//Descending Order: 
_.sortBy([2, 3, 1], function(num){ 
    return num * -1; 
}); // [3, 2, 1] 

Если вы не сортировать по строкам чисел, вы можете использовать метод charCodeAt(), чтобы получить значение Юникода.

//Descending Order Strings: 
_.sortBy(['a', 'b', 'c'], function(s){ 
    return s.charCodeAt() * -1; 
}); 
+3

Я пытаюсь сортировать по алфавиту - умножение на -1 не действительная операция. :) – rythos42

+0

Его стоит использовать, но не указан в вопросе. Однако умножение строки на -1 является действительной операцией. Он возвращает NaN, что является допустимым результатом. – jEremyB

+5

+1, чтобы избежать операции 'array.reverse' –

39

Array prototype's reverse method изменяет массив и возвращает ссылку на него, а это означает, что вы можете сделать это:

var sortedAsc = _.sortBy(collection, 'propertyName'); 
var sortedDesc = _.sortBy(collection, 'propertyName').reverse(); 

Кроме того, документация Подчеркивание гласит:

Кроме того, Array prototype's methods проксируются через связанный объект Underscore, поэтому вы можете пропустить reverse или push в свою цепочку и продолжить изменять массив.

означает, что вы можете также использовать .reverse() в то время как цепочки:

var sortedDescAndFiltered = _.chain(collection).sortBy('propertyName').reverse().filter(_.property('isGood')).value(); 
+0

Это самый простой способ сортировки по обратному/нисходящему типу, когда дело доходит до большинства простых случаев использования. –

+2

Сделать регистр без учета регистра в алфавитном порядке: '_.sortBy (collection, item => item. PropertyName.toLowerCase());' –

+0

это не работает, если в массиве есть отрицательные числа. –

6

Подобно Подчеркиваем библиотеки есть другая библиотека называется «lodash», который имеет один метод «OrderBy», который принимает в параметре, чтобы определить, в каком порядке его сортировать. Вы можете использовать его как

_.orderBy('collection', 'propertyName', 'desc') 

По какой-то причине он не задокументирован на документах веб-сайта.

+0

Я думаю, вы смутили [подчеркивание] (http://underscorejs.org/) с помощью [lodash] (https://lodash.com/). Только последняя имеет упомянутую [функцию orderBy] (https://lodash.com/docs/latest#orderBy). –

+0

Да, мой плохой. Будет обновлен ответ. Спасибо за исправление :) –

+0

'orderBy', супер полезно! Гораздо лучше, чем использование reverse, поскольку оно сохраняет стабильное свойство сортировки, которое я ищу. – Flimm

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