减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另一个数组,使用键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 } }