Javascript,如何匹配并获取包含在两个数组中的类似对象?

时间:2015-03-17 14:30:16

标签: javascript arrays

我有两个对象数组。我想按名称检查数组2中存在的数组1中的对象列表。

arr1 = [{name: "krishna", age: 27}, {name: "chandan", age 30}]
arr2 = [{name: "krishna", age: 27}, {name: "chandan", age 30}, {name: "someone", age: 30}]

arr1 intersec arr2 = [{name: "krishna", age: 27}, {name: "chandan", age 30}]

首先,我尝试迭代数组并按名称查找类似的对象,如下所示

var intersec = [];
for(var i = 0; i < arr1.length; i++) {
  for(var j = 0; j < arr2.length; j++) {
    if(arr1[i].name === arr2[j].name) {
      intersec.push(arr1[i]);
    }
  }
}

后来我认为如果数据量增加,这段代码会变得复杂。

所以我提出了另一个逻辑,我将字符串化arr1并遍历arr2并获取名称并使用stringify-ed arr1上的indexOf函数来检查它是否存在。

var exp = "name: \""+arr2[i].name+"\"";
stringArr1.indexOf(exp);

我想知道哪一个是有效的,还有其他有效的方法来做同样的事情吗?

1 个答案:

答案 0 :(得分:2)

在谈论效率时你是对的,你有两个“嵌套”循环,你上面的东西是O(n ^ 2)级别的复杂性。您希望只运行一次每个循环。

首先,我循环遍历第二个数组并创建一个对象,以便您可以轻松地按名称搜索:

var obj2 = {};
for (var i = 0; i < arr2.length; i++) {
    obj2[arr2[i].name] = arr2[i];
}

然后,循环遍历第一个数组,看看我们创建的新name对象中是否存在obj2属性:

var intersec = [];
for (var i = 0; i < arr1.length; i++) {
    if (obj2[arr1[i].name]) {
        intersec.push(arr1[i]);
    }
}

此解决方案将为您提供O(2n)级别的复杂性......更高效!