使用 underscore.js 按值对对象数组进行排序

Shi*_*vam 5 javascript sorting underscore.js

average我试图按属性按降序对对象数组进行排序- 所以最大的average在前面 - 但无法使用 underscore.js。以下是我的尝试:

var jsonData = [
{
    "title": "Dear Kitten",
    "totalCount": 1689,
    "average": 241
},
{
    "title": "Weird Things All Couples Fight About",
    "totalCount": 9966,
    "average": 1424
},
{
    "title": "If Disney Princesses Were Real",
    "totalCount": 16567,
    "average": 2367
},
{
    "title": "Secret Tricks With Everyday Objects",
    "totalCount": 24884,
    "average": 3555
},
{
    "title": "The Coolest Travel Hacks",
    "totalCount": 41847,
    "average": 8369
},
{
    "title": "5 Ways You're Drinking Coffee Wrong",
    "totalCount": 55673,
    "average": 7953
},
{
    "title": "The Perfect Way To Pour A Beer",
    "totalCount": 58097,
    "average": 58097
},
{
    "title": "Fruit You're Eating Wrong",
    "totalCount": 65570,
    "average": 32785
},
{
    "title": "Your Cat Is Judging You",
    "totalCount": 78952,
    "average": 11279
},
{
    "title": "3rd Date vs 30th Date",
    "totalCount": 84394,
    "average": 14066
}
];

console.log(_.sortBy(jsonData, "average"));
Run Code Online (Sandbox Code Playgroud)

jsFiddle

Mic*_*ary 4

这里的问题是您希望数组按 降序排序,average不是默认的升序。

iteratee您可以通过为函数提供自定义来做到这一点_.sortBy()

_.sortBy( jsonData, function( item ) { return -item.average; } )
Run Code Online (Sandbox Code Playgroud)

更新了小提琴

但我不建议这样做。最好简单地使用原生 JavaScript[].sort()方法并为其提供一个比较函数:

jsonData.sort( function( a, b ) { return b.average - a.average; } )
Run Code Online (Sandbox Code Playgroud)

更好的小提琴

如果您要对非常大的数组进行排序,这也会比使用_.sortBy(). 查看源码就_.sortBy()知道原因了:

_.sortBy = function(obj, iteratee, context) {
  iteratee = cb(iteratee, context);
  return _.pluck(_.map(obj, function(value, index, list) {
    return {
      value: value,
      index: index,
      criteria: iteratee(value, index, list)
    };
  }).sort(function(left, right) {
    var a = left.criteria;
    var b = right.criteria;
    if (a !== b) {
      if (a > b || a === void 0) return 1;
      if (a < b || b === void 0) return -1;
    }
    return left.index - right.index;
  }), 'value');
};
Run Code Online (Sandbox Code Playgroud)

除了调用之外,它还做了相当多的工作.sort()——这段代码只是冰山一角,它调用的辅助函数也cb()做了很多工作。

既然直接给自己打电话也很容易,为什么还要这么做呢.sort()

另外,需要仔细阅读冗长的.sortBy()源代码才能确保它进行数字排序而不是字典排序 - 并且文档没有说

字典排序(又称字母排序)是将值排序为字符串,而不是数字。例如,它将使用以下顺序:

[ 1424, 2367, 241, ... ]
Run Code Online (Sandbox Code Playgroud)

当您自己调用本机数组时.sort(),您可以轻松验证它是否使用数字排序:值b.average - a.average始终是数字。