过滤和排序 JavaScript 数组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/39302871/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Filter and sort a JavaScript array
提问by James
I have an array like this:
我有一个这样的数组:
[{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}, {
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}]
I am trying to create a new array with the following criteria:
我正在尝试使用以下条件创建一个新数组:
- Get highest rating (
array.rating.average
) of each number (array.number
)
- 获得
array.rating.average
每个数字 (array.number
) 的最高评分( )
Output should be:
输出应该是:
[{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}
}]
I have just managed to sort by highest rating:
我刚刚设法按最高评分排序:
array.sort(function(a , b) {
return a.rating.average - b.rating.average;
});
array.reverse();
But, now, I just only want one object per duplicate array.number
, keeping the one that has the highest array.rating.average
.
但是,现在,我只想要每个副本一个对象array.number
,保留具有最高array.rating.average
.
回答by Haibara Ai
array.sort((a, b) => {
if(a.number === b.number) {
// If two elements have same number, then the one who has larger rating.average wins
return b.rating.average - a.rating.average;
} else {
// If two elements have different number, then the one who has larger number wins
return b.number - a.number;
}
});
array = array.filter((element, index) => {
return index === 0 || element.number !== array[index-1].number;
});
For your test case,
对于您的测试用例,
[{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}, {
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}]
After sorting, the output would be
排序后,输出将是
[{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}]
And after filter, the final result:
过滤后,最终结果:
[{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}]
回答by StardustGogeta
arr = [{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}, {
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}]
arr = arr.sort(function(a,b){return b.number-a.number || b.rating.average-a.rating.average}).filter(function(a,b,c){return !b || c[b-1].number != a.number});
console.log(arr);
I believe that this will solve your problem by sorting and filtering.
我相信这将通过排序和过滤来解决您的问题。
EDIT: Should now support older browsers.
编辑:现在应该支持旧浏览器。
回答by Daniel Tran
First you create a dictionary for keeping the highest rating for each number:
首先,您创建一个字典来保持每个数字的最高评分:
var data = [{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}, {
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}];
var filterMap = {};
data.forEach(function (item) {
if (!filterMap[item.number] || filterMap[item.number].rating.average < item.rating.average) {
filterMap[item.number] = item;
}
})
var result = [];
for (var number in filterMap) {
result.push(filterMap[number]);
}
result.sort(function(a , b) {
return b.rating.average - a.rating.average;
});
console.log(result);
回答by jenish
Simply you can use lodash method for sort by anything that you want to sort by fileName, number, etc.
简单地,您可以使用 lodash 方法按您想按文件名、数字等排序的任何内容进行排序。
const _ = require('lodash');
var data = [{
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 6.4
}
}, {
"number": "3",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}, {
"number": "4",
"fileName": "fileXX",
"rating": {
"average": 5.4
}
}]
var result = _.sortBy(data, ['number']);
console.log(result)
Output:
[ { number: '3', fileName: 'fileXX', rating: { average: 5.4 } },
{ number: '4', fileName: 'fileXX', rating: { average: 6.4 } },
{ number: '4', fileName: 'fileXX', rating: { average: 5.4 } } ]