web-dev-qa-db-ja.com

lodash複数列sortBy降順

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

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

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

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

lodash 3.5.0の時点で、 sortByOrder (v4.3.0では orderBy に変更)を使用できます:

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']);

Lodashのバージョン4では、このメソッドの名前が変更されました orderBy

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

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

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

特定のプロパティを降順で並べ替える場合は、末尾に.reverse()を単に追加したくないことに注意してください。これにより、すべての並べ替えが降順になります。

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

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

_の並べ替えは安定した並べ替えであるため、2つのアイテムのプロパティの値が同じである場合、その順序が保持されるため、並べ替えを安全に連鎖および逆にすることができます。

詳細

14
cttlfsh

ディープフィールド&マルチフィールド&異なる方向注文Lodash> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);
8
Mesut Yiğit

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

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

できるかもしれない

 _.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
         || …;
 });
5
Bergi

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

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

2
Alejandro Silva

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

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