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