我需要一种快速的方法来执行此操作。它必须快。
在数组中,对象已按分数排序。我想为任何给定的rootTerm创建一个包含前2个得分对象的新数组。
这是原作。
"results": [
{
"score": 100,
"source": {
"term": "bovine1",
"rootTerm": "cow",
}
},
{
"score": 50,
"source": {
"term": "bovine2",
"rootTerm": "cow",
}
},
{
"score": 10,
"source": {
"term": "bovine3",
"rootTerm": "cow",
}
},
{
"score": 10,
"source": {
"term": "scrofa",
"rootTerm": "pig",
}
]
Bovine3不是rootTerm cow最高的2个得分对象,所以我希望将其删除。
新结果将是
"results": [
{
"score": 100,
"source": {
"term": "bovine1",
"rootTerm": "cow",
}
},
{
"score": 50,
"source": {
"term": "bovine2",
"rootTerm": "cow",
}
},
{
"score": 10,
"source": {
"term": "scrofa",
"rootTerm": "pig",
}
]
答案 0 :(得分:1)
您可以使用Array.filter()
对其进行过滤,但您需要在看到它们时跟踪rootTerms,并随着时间的推移进行计数。
var tracker = {};
data.filter(function(value, index, array) {
var rootTerm = value.source.rootTerm;
if (undefined === tracker[rootTerm])
{
tracker[rootTerm] = 0;
}
tracker[rootTerm] += 1;
return (tracker[rootTerm] <= 2)
});
答案 1 :(得分:0)
使用键cow
,pig
等创建另一个数组,并将值设置为0.每次使用给定键传递实体时,迭代原始数组并增加第二个数组中的值。如果值为2或更大,则删除实体。
示例:
var counter = [pig: 0, cow: 0];
foreach(var key in originalArray) {
if(++counter[originalArray[key].source.rootTerm] >= 2) {
// remove somehow the item (maybe using array.splice() )... its on you
}
}