Lodash:orderByを使用してコレクションで大文字と小文字を区別しない並べ替えを行う方法は?


90

私がチェックし、この答えはなく、大文字と小文字を区別しないソートを取得することで、同じ結果を達成するために、私が使用する必要があるorderByの代わりをsortByするので、それはソート順序を指定することができます

それを達成するために私が見つけた唯一の方法は、小文字にマップされたクローンの「中間」配列を作成することでした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);

これは非常にコストがかかるようで、複数の並べ替えと動的プロパティ名を使用するとさらに複雑になります。

より良いアイデアはありますか?


これがプランカーです:https://plnkr.co/edit/i1ywyxjFctuNfHtPTcgG

回答:


190

ドキュメントあなたは「iteratee」としての機能を渡すことができます指定:

[iteratees = [_。identity]](Array [] | Function [] | Object [] | string []):並べ替えを繰り返します。

だからあなたはすることができます

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
これは古いブラウザでは失敗する可能性があります。
2017

16
これがES6をサポートしていないブラウザで構文エラーをスローすることを意味する場合は、もちろんそうです。私は(と「通常の」関数に矢印変換機能を残しておきますconstvar、読者への課題として)。
Felix Kling 2017

@TheCaptan:そうすべきでない理由はありません。
Felix Kling 2017

2
私は次のようにTheCaptanの質問@しようとするが、コンパイラのエラーを取得しています:const sortedUsers = _.orderBy(users, [user => user[propToSort].toLowerCase()], ['desc']);
im1dermike

1
@ im1dermike:.toString()小文字を呼び出す前に使用することをお勧めします。さらにproperty.something、propToSortなどに使用する場合は、使用できます_.get(user, propToSort)(おそらく、これは他の誰かに役立ちます)
Soniku 2018

10

複数のプロパティによる順序付け:

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

Felix Klingの例を_.get関数と組み合わせて、動的にネストされた属性で並べ替えることができます。

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()]);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.