lodash çok sütunlu sıralama Azalan


163

Bir dizi nesneyi birkaç özelliğe göre sıralamak için şık bir yöntem vardır:

var data = _.sortBy(array_of_objects, ['type', 'name']);

Ancak bu yalnızca artan sıralama içindir. Sütun başına yönü tanımlamanın kullanışlı bir yolu var mı? Örneğin

var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);

Yanıtlar:


349

İtibariyle lodash 3.5.0 kullanabileceğiniz sortByOrder (adını orderBy v4.3.0 olarak):

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);

3.10.0 sürümünden bu yana , sıralama için standart semantik bile kullanabilirsiniz (artan, azalan):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);

Gelen sürüm 4 lodash bu yöntem yeniden adlandırıldı orderBy :

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);

9
Bilginize, bu işlev 4.3.0'dan itibaren Lodash'ta _.orderBy ( lodash.com/docs#orderBy ) olarak yeniden adlandırılmıştır . Normal sıralama işlevinin adı _.sortBy ( lodash.com/docs#sortBy )
Nidhin David,

2
Ben alıyorum _.sortByOrder is not a functionlodash en son sürümünde.
chovy

67
Lodash neden işlevleri yeniden adlandırmaya devam ediyor?
Kenny Worden

17
Bu , ['asc', 'desc']kısım, lodash@4.17.10 ile benim için göz ardı ediliyor. Her şey sadece artan şekilde sıralanır.
maninak

6
@maninak Bu _.sortBy. Onun _.orderByyerine deneyin . Bu yardımcı olur umarım.
pcasme

49

Her zaman kullanabilirsin Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();

ha bu zekice. artan sayısal sıralama için (azalan lodash varsayılanları) Bunu kullandım: _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
Bazı durumlar için yeterince iyi olsa da, bunun etkisi her İKİ sütununa göre azalan sıralama yapmaktır, bu sorunun sorduğu şey değildir.
Inkling


15

Belirtmek gerekir ki, belirli özellikleri azalan şekilde sıralamak istiyorsanız, sonuna .reverse () eklemek istemezsiniz, çünkü bu, tüm türleri azalan hale getirir.

Azalan belirli sıralamalar yapmak için, sıralamalarınızı en önemsizden en önemliye doğru zincirleyin, azalan olmasını istediğiniz her türden sonra .reverse () çağırın.

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()

_'Nin sıralaması kararlı bir sıralama olduğundan, güvenli bir şekilde zincirleme ve ters sıralamayı yapabilirsiniz, çünkü iki öğe bir özellik için aynı değere sahipse, sıraları korunur.

Daha fazla bilgi


Yorum yapmak için yeterli temsilciniz yoksa yorum yapmayın. Bunu gerçek bir cevaba dönüştürmüş olsanız da, bu iyi, ama bu gerçeği belirtmenize bile gerek yok.
ArtOfCode



5

Sütun başına yönü tanımlamanın kullanışlı bir yolu var mı?

Hayır. Değeri ters çeviren bir geri arama işlevi dışında sıralama düzenini belirtemezsiniz. Çok sütunlu sıralama için bu bile mümkün değildir.

Yapabilirsin

 _.each(array_of_objects, function(o) {
     o.typeDesc = -o.type; // assuming a number
 });
 _.sortBy(array_of_objects, ['typeDesc', 'name'])

Diğer her şey için, .sort()özel bir karşılaştırma işleviyle yerele başvurmanız gerekecek :

 array_of_objects.sort(function(a, b) {
     return a.type - b.type // asc
         || +(b.name>a.name)||-(a.name>b.name) // desc
         || …;
 });

5

4.11.x sürümünün belgelerinde şöyle diyor: "Bu yöntem, sıralanacak yinelemelerin sıralama düzenlerinin belirlenmesine izin vermesi dışında _.sortBy gibidir. Siparişler belirtilmemişse, tüm değerler artan düzende sıralanır. Aksi takdirde , azalan için "azalan" veya karşılık gelen değerlerin artan sıralama düzeni için "artan" sıralaması belirtin. " (kaynak https://lodash.com/docs/4.17.10#orderBy )

let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])


Sanırım kullanmak istedin _.sortByOrder?
AJ Richardson

değişken bulunamıyor _
Vishal Vaghasiya


0

Şunu da deneyebilirsiniz:

var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));

Bu sadece _.orderBy'yi kullanmaktan çok daha yavaş olacak
reggaeguitar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.