2013-02-28 7 views
141

Obecnie używam underscore do sortowania mojego sortowania json. Teraz poprosiłem o sortowanie ascending i descending przy użyciu pliku underscore.js. W dokumentacji nie widzę niczego podobnego. Jak mogę to osiągnąć?Jak mogę wykonać asc i desc sort przy użyciu pliku underscore.js?

+1

Dodaj przykład sortowania i sposobu. – Jon

+0

Co sortujesz? Liczby? Smyczki? Daktyle? Coś innego? –

+0

@muistooshort Sortuję tablicę obiektów. Tak więc metoda sortBoy pasuje do moich kryteriów idealnie do sortowania rosnącego, ale nie odwrotnie. – Rahul

Odpowiedz

318

Można użyć .sortBy, to zawsze zwracać rosnąco listę:

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

Ale można użyć metody .reverse dostać to malejąco:

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

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

Albo gdy mamy do czynienia z liczbami dodać znak ujemny do powrotu, aby zejść z listy:

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

Pod maską .sortBy wykorzystuje wbudowany w .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

Ostatnie rozwiązanie tj. Dodanie znaku negetycznego do zwróconej wartości jest idealne. – vinesh

+0

Dlaczego uważasz, że to rodzaj bąbelków? Pod maską '.sortBy()' wywołuje wbudowane 'Array.sort()', którego algorytm zależy od dostawców przeglądarek, ale sortowanie bąbelkowe raczej nie będzie ich wyborem. –

+0

Czy to nie zwiększa złożoności czasu? Powoduje, że lista jest sortowana dwukrotnie. – user1477388

46

kolejności malejącej przy użyciu podkreślenia można zrobić poprzez pomnożenie wartości zwracanej przez -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] 

Jeśli sortując nie ciągów liczb, można użyć metody charCodeAt(), aby uzyskać wartość Unicode.

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

Próbuję posortować alfabetycznie - pomnożenie przez -1 nie jest ważna operacja. :) – rythos42

+0

Jest to warty użycia przypadek użycia, ale nie określono w pytaniu. Jednak mnożenie ciągu przez -1 jest poprawną operacją. Zwraca wartość NaN, która jest poprawnym wynikiem. – jEremyB

+5

+1, aby uniknąć operacji 'array.reverse' –

39

Array prototype's reverse method modyfikuje tablicę i zwraca referencję do niego, co oznacza, że ​​można to zrobić:

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

Również dokumentacja podkreślenia brzmi:

Ponadto Array prototype's methods są wyświetlane za pośrednictwem przyklejonego obiektu podkreślenia, więc możesz wsunąć do łańcucha łańcuch reverse lub push i kontynuować modyfikowanie tablicy.

co oznacza, można również użyć .reverse() podczas łączenia:

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

To jest opłata za najprostszą metodę sortowania wstecznego/malejąco, jeśli chodzi o najprostsze przypadki użycia. –

+2

Aby uzyskać sortowanie alfabetyczne bez rozróżniania wielkości liter: '_.sortBy (kolekcja, element => element. PropertyName.toLowerCase());' –

+0

to nie działa, jeśli w tablicy znajdują się liczby ujemne. –

6

Podobny podkreślić biblioteki istnieje inna biblioteka nazywa się „lodash”, który ma jedną metodę „orderby”, który trwa w parametrze do określenia w jakiej kolejności go posortować. Możesz go używać tak, jak z pewnej przyczyny nie jest to udokumentowane w dokumentach witryny z pewnymi przyczynami, jak np.

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

Myślę, że pomyliłeś [podkreślenie] (http://underscorejs.org/) z [lodash] (https://lodash.com/). Tylko ta ostatnia ma wspomnianą funkcję [orderBy] (https://lodash.com/docs/latest#orderBy). –

+0

Tak, moje złe. Zaktualizuje odpowiedź. Dzięki za poprawianie :) –

+0

'orderBy', super przydatne! Znacznie lepiej niż przy użyciu reverse, ponieważ zachowuje on właściwość stabilnego sortowania, której szukam. – Flimm

Powiązane problemy