lodash multi-column sortBy下降
有一个漂亮的方法来基于几个属性对对象数组进行sorting:
var data = _.sortBy(array_of_objects, ['type', 'name']);
但是,这只是升序sorting。 有没有方便的方法来定义每列的方向? 例如
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开始 ,甚至可以使用标准语义进行sorting(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();
值得注意的是,如果你想对特定的属性进行降序sorting,你不想简单地在最后加上.reverse(),因为这会使所有的sorting降序。
为了降低特定的sorting,将你的sorting从最不重要的到最重要的sorting,在你想要下降的sorting之后调用.reverse()。
var data = _(data).chain() .sort("date") .reverse() // sort by date descending .sort("name") // sort by name ascending .result()
由于_的sorting是一个稳定的sorting,所以可以安全地链接和sortingsorting,因为如果两个项目具有相同的属性值,它们的顺序将被保留。
更多信息
有没有方便的方法来定义每列的方向?
不可以。您不能指定sorting顺序,而不是通过反转该值的callback函数。 即使这是多列sorting也是不可能的。
你也许可以做到
_.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 || …; });
深层领域&多领域&不同的方向排列Lodash> 4
var sortedArray = _.orderBy(mixedArray, ['foo','foo.bar','bar.foo.bar'], ['desc','asc','desc']);
在版本4.11.x的文档中说:“这个方法就像_.sortBy,只是它允许指定迭代的sorting顺序进行sorting,如果没有指定顺序,所有的值都按升序排列,否则,请指定“desc”的降序顺序或“asc”顺序的升序顺序。 (来源https://lodash.com/docs#sortBy )
let sorted = _.sortBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])
你也可以试试这个:
var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));