いくつかのプロパティに基づいてオブジェクトの配列を並べ替える気の利いたメソッドがあります:
var data = _.sortBy(array_of_objects, ['type', 'name']);
ただし、これは昇順の並べ替えのみです。列ごとに方向を定義する便利な方法はありますか?例えば。
var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);
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']);
いつでもArray.prototype.reverse()
を使用できます
var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();
特定のプロパティを降順で並べ替える場合は、末尾に.reverse()を単に追加したくないことに注意してください。これにより、すべての並べ替えが降順になります。
特定のソートを降順にするには、ソートを最下位から最上位に連鎖させ、降順にする各ソートの後に.reverse()を呼び出します。
var data = _(data).chain()
.sort("date")
.reverse() // sort by date descending
.sort("name") // sort by name ascending
.result()
_の並べ替えは安定した並べ替えであるため、2つのアイテムのプロパティの値が同じである場合、その順序が保持されるため、並べ替えを安全に連鎖および逆にすることができます。
ディープフィールド&マルチフィールド&異なる方向注文Lodash> 4
var sortedArray = _.orderBy(mixedArray,
['foo','foo.bar','bar.foo.bar'],
['desc','asc','desc']);
列ごとに方向を定義する便利な方法はありますか?
いいえ。値を逆にするコールバック関数以外のソート順を指定することはできません。複数列の並べ替えでは、これも不可能です。
できるかもしれない
_.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
|| …;
});
バージョン4.11.xのドキュメントには次のように記述されています。 、降順の場合は「desc」、対応する値の昇順のソート順の場合は「asc」の順序を指定します。 (ソース https://lodash.com/docs/4.17.10#orderBy )
let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])
これを試すこともできます:
var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));