有一种巧妙的方法可以基于多个属性对对象数组进行排序:
var data = _.sortBy(array_of_objects, ['type', 'name']);
然而,这仅适用于升序排序。是否有一种方便的方法可以按列定义排序方向?例如:
var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);
有一种巧妙的方法可以基于多个属性对对象数组进行排序:
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版本开始,您甚至可以使用标准的语义来进行排序(升序,降序):
var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);
在版本4的lodash中,这个方法已被重命名为orderBy:
var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);
您总是可以使用Array.prototype.reverse()
var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();
深度字段 & 多字段 & 不同方向 排序 Lodash >4
var sortedArray = _.orderBy(mixedArray,
['foo','foo.bar','bar.foo.bar'],
['desc','asc','desc']);
var data = _(data).chain()
.sort("date")
.reverse() // sort by date descending
.sort("name") // sort by name ascending
.result()
由于Underscore的排序是稳定的,因此您可以安全地链接和反转排序,因为如果两个项目对于某个属性具有相同的值,则它们的顺序会被保留。
let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])
意思是将this.items按照'fieldFoo'和'fieldBar'这两个字段进行排序,其中'fieldFoo'按照升序排列,'fieldBar'按照降序排列。_.sortByOrder
? - AJ Richardson有没有一种方便的方法来为每列定义排序方向?
没有。除了通过反转数值的回调函数指定排序顺序之外,您无法指定排序顺序。对于多列排序,甚至这也不可能。
您可能可以这样做:
_.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
|| …;
});
你也可以尝试这个:
var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));
_.sortByOrder不是一个函数
的问题。 - chovy['asc', 'desc']
这一部分对我来说被忽略了。所有元素都是按升序排序的。 - maninak_.sortBy
的。请尝试使用_.orderBy
代替。希望这有所帮助。 - pcasme