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

时间:2014-04-22 22:18:42

标签: javascript arrays node.js sorting npm

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

在数组中,对象已按分数排序。我想为任何给定的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",
            }
]

2 个答案:

答案 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)

使用键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
    }
}