Javascript lodash多列排序法
有一种巧妙的方法可以根据几个属性对对象数组进行排序:Javascript lodash多列排序法,javascript,sorting,lodash,Javascript,Sorting,Lodash,有一种巧妙的方法可以根据几个属性对对象数组进行排序: 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'}]);
是否有一些方便的方法来定义每列的方向
不可以。只能通过反转值的回调函数来指定排序顺序。对于多列排序,这甚至是不可能的
你也许能做到
_.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()
值得注意的是,如果要对特定属性进行降序排序,则不希望在末尾简单地追加.reverse(),因为这将使所有排序都降序
var data = _(data).chain()
.sort("date")
.reverse() // sort by date descending
.sort("name") // sort by name ascending
.result()
要使特定排序降序,请将排序从最低有效链接到最高有效,在每个要降序的排序之后调用.reverse()
var data = _(data).chain()
.sort("date")
.reverse() // sort by date descending
.sort("name") // sort by name ascending
.result()
由于u的排序是一种稳定排序,因此可以安全地链接和反向排序,因为如果两个项的属性值相同,则它们的顺序将保持不变
从lodash 3.5.0开始,您可以使用(在v4.3.0中重命名): 由于版本3.10.0您甚至可以使用标准语义进行订购(asc、desc): 在lodash的版本4中,此方法已重命名为:
在版本4.11.x的文档中,说明:` 此方法类似于u.sortBy,只是它允许指定要排序的迭代对象的排序顺序。如果未指定排序顺序,则所有值都按升序排序。否则,请指定降序的“desc”顺序,或相应值的升序的“asc”顺序 (来源)
let sorted=\uu.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']));
如果您没有足够的代表发表评论,请不要发表评论。虽然你已经把它充实成了一个真实的答案,这很好,但你甚至不需要提及这个事实。请给出一个答案?哈,这很聪明。对于升序数字排序(lodash默认值为降序),我使用了以下方法:\ uu.sortBy(数组\对象,“一些\数值\值\键”)。reverse()虽然对于某些情况来说已经足够好了,但其效果是对两列进行降序排序,这不是问题所要求的。请给出一个答案?请注意,从4.3.0开始,此函数在Lodash中已重命名为u.orderBy()。正常的排序函数被称为u.sortBy(),我得到的是
。
。为什么lodash一直在重命名函数呢?对于我来说,,['asc','desc']
部分被忽略了lodash@4.17.10. 一切都是按升序排序的。@maninak这是为排序的。
。请改为尝试。.orderBy
。希望这能有所帮助。我想你是想使用。.sortByOrder
?找不到变量\u请建议答案?事实上,这就是现在的答案。sortBy不会给你指示,但orderBy会。请给出一个答案?这将比仅仅使用u.orderBy慢得多
var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);
var sortedArray = _.orderBy(mixedArray,
['foo','foo.bar','bar.foo.bar'],
['desc','asc','desc']);
var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));