我有两个对象数组。我想按名称检查数组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);
我想知道哪一个是有效的,还有其他有效的方法来做同样的事情吗?
答案 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)级别的复杂性......更高效!