Lodash: orderBy kullanarak bir koleksiyonda büyük / küçük harfe duyarlı olmayan sıralama nasıl yapılır?


90

Ben kontrol bu cevabı ancak küçük harf duyarsız sıralama elde etmektir aynı sonucu elde etmek, ben kullanmak gerekir orderByyerine sortByberi bu sıralama düzeni belirleme yeteneği sağlar .

Bunu başarmanın tek yolu, küçük harfe eşlenmiş klonlanmış bir "orta" dizi oluşturmaktı name:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

let lowerCaseUsers = _.clone(users);

lowerCaseUsers = lowerCaseUsers.map((user) => {
  user.name = user.name.toLowerCase();
  return user;
});

const sortedUsers = _.orderBy(lowerCaseUsers, ['name'], ['desc']);

console.log(sortedUsers);

Bu gerçekten pahalı görünüyor ve çoklu sıralama ve dinamik özellik adlarıyla daha da karmaşık olacak.

Daha iyi bir fikir var mı?


İşte bir Plunker: https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

Yanıtlar:


190

Dokümantasyon siz "iteratee" gibi bir işlev geçirebilmesi belirtir:

[iteratees = [_. kimlik]] (Dizi [] | İşlev [] | Nesne [] | dize []): Sıralama ölçütü olarak kullanılacak yinelemeler.

Yani yapabilirsin

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
];

const sortedUsers = _.orderBy(users, [user => user.name.toLowerCase()], ['desc']);
console.log(sortedUsers);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>


2
Bu, eski tarayıcılarda başarısız olabilir.
steampowered

16
Bunun tarayıcıda ES6'yı desteklemeyen bir sözdizimi hatası vereceğini kastediyorsanız, o zaman evet, elbette. Ok işlevini "normal" bir işleve (ve conste var) dönüştürmeyi okuyucuya egzersiz olarak bırakacağım .
Felix Kling

@TheCaptan: Olmaması için hiçbir sebep yok.
Felix Kling

2
@ TheCaptan'ın sorusunu aşağıdakilerle deniyorum, ancak bir derleyici hatası alıyorum:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike

1
@ im1dermike: Muhtemelen .toString()orada küçük harfe çağrı yapmadan önce kullanmak istersiniz , ayrıca property.somethingpropToSort ve benzeri için kullanmak istiyorsanız kullanabilirsiniz _.get(user, propToSort)(belki bu başka birine yardımcı olur)
Soniku

10

Birden çok mülke göre sıralama:

const users = [
  { name: 'A', age: 48 },
  { name: 'B', age: 34 },
  { name: 'b', age: 40 },
  { name: 'a', age: 36 }
]

const nameSorter = user => user.name.toLowerCase()
const ageSorter = 'age'

const sortedUsers = _.orderBy(users, [nameSorter, ageSorter], ['desc', 'asc'])

2

Dinamik iç içe özniteliklere göre sıralamak için Felix Kling örneğini _.get işleviyle birleştirebilirsiniz:

const _ = require('lodash');

let test = [{ a: {b:'AA'}},{a: {b:'BB'} }, {a: {b: 'bb'}}, {a:{b:'aa'}}];

let attrPath = 'a.b';

_.orderBy(test, [item => _.get(item, attrPath).toLowerCase()]);
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.