Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript lodash多列排序法_Javascript_Sorting_Lodash - Fatal编程技术网

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