减less对象数组:根据另一个字段的值限制相似的字段

我需要一个快速的方式来执行此操作。 它必须快速。

在数组中,对象已按分数sorting。 我想为任何给定的rootTerm创build一个新的数组。

这是原来的。

"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牛最高得分最高的2个对象,所以我希望它被删除。

新的结果将是

 "results": [ { "score": 100, "source": { "term": "bovine1", "rootTerm": "cow", } }, { "score": 50, "source": { "term": "bovine2", "rootTerm": "cow", } }, { "score": 10, "source": { "term": "scrofa", "rootTerm": "pig", } ] 

你可以使用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) }); 

创build另一个数组,使用键cowpig等,并将值设置为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 } }