使用 underscore.js 按值对对象数组进行排序
Sort array of objects by value using 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"));
这里的问题是您希望数组按 降序 顺序 average
排序,而不是默认的升序。
您可以通过向 _.sortBy()
函数提供自定义 iteratee
来做到这一点:
_.sortBy( jsonData, function( item ) { return -item.average; } )
但我不推荐这样做。直接使用原生的 JavaScript [].sort()
方法并提供比较功能会好得多:
jsonData.sort( function( a, b ) { return b.average - a.average; } )
如果您要对非常大的数组进行排序,这也比使用 _.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');
};
除了 .sort()
调用之外,它还做了很多工作 - 这段代码只是冰山一角,它调用的辅助函数 cb()
做了很多工作也是。
既然自己直接调用 .sort()
也很容易,为什么还要这样做呢?
此外,需要仔细阅读冗长的 .sortBy()
源代码,以确保它执行 数字 排序而不是字典排序 - 并且 the documentation doesn't say!
字典排序(又名字母排序)是将值排序为字符串,而不是数字。因此,例如它将使用此顺序:
[ 1424, 2367, 241, ... ]
当您自己调用本机数组 .sort()
时,您可以轻松验证它是否使用数字排序:值 b.average - a.average
始终是一个数字。
我正在尝试按 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"));
这里的问题是您希望数组按 降序 顺序 average
排序,而不是默认的升序。
您可以通过向 _.sortBy()
函数提供自定义 iteratee
来做到这一点:
_.sortBy( jsonData, function( item ) { return -item.average; } )
但我不推荐这样做。直接使用原生的 JavaScript [].sort()
方法并提供比较功能会好得多:
jsonData.sort( function( a, b ) { return b.average - a.average; } )
如果您要对非常大的数组进行排序,这也比使用 _.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');
};
除了 .sort()
调用之外,它还做了很多工作 - 这段代码只是冰山一角,它调用的辅助函数 cb()
做了很多工作也是。
既然自己直接调用 .sort()
也很容易,为什么还要这样做呢?
此外,需要仔细阅读冗长的 .sortBy()
源代码,以确保它执行 数字 排序而不是字典排序 - 并且 the documentation doesn't say!
字典排序(又名字母排序)是将值排序为字符串,而不是数字。因此,例如它将使用此顺序:
[ 1424, 2367, 241, ... ]
当您自己调用本机数组 .sort()
时,您可以轻松验证它是否使用数字排序:值 b.average - a.average
始终是一个数字。