多列分类

有一个很好的方法可以根据几个属性对对象数组进行排序:

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

However that is only for ascending sorting. Is there some handy way of defining direction per column? E.g.

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

是否有一些方便的方法来定义每列的方向?

没有。除了通过反转值的回调函数外,不能指定排序顺序。即使对于多列排序,这也是不可能的。

你也许能做到

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

你可以随时使用 Array.prototype.reverse()

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

值得注意的是,如果希望按降序对特定属性排序,就不需要简单地附加。在最后使用 return () ,因为这会使所有的排序都降序。

要使特定的排序下降,请将排序从最不重要的调用链接到最重要的调用。在每次要降序的排序之后使用 return ()。

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

由于 _’s sort 是一种稳定的排序,因此可以安全地进行链式和反向排序,因为如果两个项对于一个属性具有相同的值,则它们的顺序保持不变。

更多信息

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

在 loash 的 版本4中,这个方法被重命名为 OrderBy:

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

在4.11.x 版本的文档中写道: ”这个方法就像。SortBy,除了它允许指定迭代器的排序顺序。如果未指定顺序,则所有值按升序排序。否则,为降序指定“ desc”顺序,为相应值的升序排序指定“ asc”顺序 (来源 https://lodash.com/docs/4.17.10#orderBy)

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

深场、多场、不同方向 有序 Lodash > 4

var sortedArray = _.orderBy(mixedArray,
['foo','foo.bar','bar.foo.bar'],
['desc','asc','desc']);

你也可以试试这个:

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