检查来自不同数组的两个元素的一个属性是否相等?

时间:2016-05-08 18:57:44

标签: javascript arrays

目前我一直在使用嵌套for循环来解决这个问题:

for (var i = 0; i < this.props.trackedPlayers.length; i++)
{
    for (var j = 0; j < PHP_VARS.players_data.length; j++)
    {
        // This check here is the key part
        if (PHP_VARS.players_data[j]._id == this.props.trackedPlayers[i]._id)
        {
            data.push(// stuff from both arrays..);
        }
    }
}

但是我想可能有一个样板函数已经这样做了。做了几次搜索但没有任何问题 - 任何指针,或者这是我现在最好的搜索?

编辑:简要说明,trackedPlayers全部来自players_data。通过检查(通常)较大的players_data中的每个玩家是否在trackedPlayers中,我知道是否将它们列为“添加”到HTML选择字段的选项。

2 个答案:

答案 0 :(得分:1)

您可以将对象用作哈希表并迭代两个数组,首先用于构建哈希表,第二个用于测试和进一步操作。

var object = Object.create(null);
this.props.trackedPlayers.forEach(function (a) {
    object[a._id] = a;
});
PHP_VARS.players_data.forEach(function (a) {
    if (object[a._id]) {
        // access data from this.props.trackedPlayers
        // with object[a._id]._id as example
        // access data from  PHP_VARS.players_data
        // with a._id as example
        data.push(/* stuff from both arrays..*/);
    }
});

答案 1 :(得分:0)

lodash库具有_.intersectionBy()功能,可以完全满足您的需求。使用此功能,您可以将代码更改为:

_.intersectionBy([PHP_VARS.players_data, this.props.trackedPlayers], "_id")
  .forEach(element=> {
    data.push(/* ... */)
  })

或使用for...of循环:

const intersection = _.intersectionBy([PHP_VARS.players_data, this.props.trackedPlayers], "_id")
for (element of intersection) {
  data.push(/* ... */)
}