lodashマルチカラムsortBy降順


151

いくつかのプロパティに基づいてオブジェクトの配列を並べ替える気の利いた方法があります。

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

ただし、それは昇順のソートのみです。列ごとに方向を定義する便利な方法はありますか?例えば

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

回答:


329

以下のようlodash 3.5.0を使用できsortByOrder(名前を変更ORDERBYを v4.3.0には):

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

バージョン3.10.0以降、順序付けに標準のセマンティクス(asc、desc)を使用することもできます。

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

では、バージョン4 lodashこのメソッドの名前が変更されました[並べ替え

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

7
ちなみに、この関数は4.3.0以降、Lodashで_.orderBy(lodash.com/docs#orderBy)に名前が変更されました。通常のソート関数は_.sortBy(lodash.com/docs#sortBy)と呼ばれます
Nidhin David

2
私は取得しています_.sortByOrder is not a functionlodashの最新バージョンで。
2016年

66
lodashが関数の名前を変更し続けるのはなぜですか?
ケニーワーデン

13
この, ['asc', 'desc']部分はlodash@4.17.10で無視されています。すべてが昇順にソートされています。
マニナック

4
@maninakこれは_.sortBy_.orderBy代わりに試してください。お役に立てれば。
pcasme

45

いつでも使用できます Array.prototype.reverse()

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

ハハハハハ。昇順の数値ソート(lodashのデフォルトは降順)の場合:_.sortBy(array_of_objects、 "some_numerical_value_key")。reverse()
devonj

3
場合によっては十分ですが、これの効果はBOTH列で降順で並べ替えることです。これは質問が尋ねるものではありません。
2017年

答えを提案してください。stackoverflow.com/questions/62611489/...
reacg garav

14

特定のプロパティを降順に並べ替える場合は、末尾に.reverse()を追加するだけでは、すべての並べ替えが降順になるため、注意する必要があります。

特定のソートを降順にするには、ソートを最下位から最上位にチェーンし、降順にする各ソートの後に.reverse()を呼び出します。

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

_の並べ替えは安定した並べ替えなので、2つの項目のプロパティの値が同じである場合、それらの順序が保持されるため、安全にチェーンおよび逆順に並べ替えることができます。

詳しくは


コメントするのに十分な担当者がいない場合は、コメントしないでください。あなたはこれを具体的な答えに具体化しましたが、それは良いことですが、あなたはその事実に言及する必要さえありません。
ArtOfCode 2015年

答えを提案してください。stackoverflow.com/questions/62611489/...
reacg garav


5

列ごとに方向を定義する便利な方法はありますか?

いいえ。値を逆にするコールバック関数以外ではソート順を指定できません。複数列の並べ替えでは、これは不可能です。

あなたができるかもしれません

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

それ以外の場合は.sort()、カスタム比較関数を使用してネイティブに頼る必要があります。

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

3

バージョン4.11.xのドキュメントでは、次のように述べています。 、降順の場合は「desc」、対応する値の昇順の場合は「asc」の順序を指定します。(ソースhttps://lodash.com/docs/4.17.10#orderBy

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


使うつもりだったと思います_.sortByOrderか?
AJリチャードソン

変数_が見つかりません
Vishal Vaghasiya

答えを提案してください。stackoverflow.com/questions/62611489/...
reacg garav

0

これを試すこともできます:

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

これは、_。orderByを使用するよりもはるかに遅くなります
reggaeguitar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.