我有2个数组如下,
var arr1 = [{'_id':'192983','nt':'1246699993'},{'_id':'192984','nt':'1246699994'}];
var arr2 = [{'title':'ABX1','nt':'2398389'},{'title':'ABX2','nt':'1246699994'}];
预期结果:
[{'title':'ABX2','nt':'1246699994'}]
从2个数组中,我想排除两个数组中与'nt'键匹配的数组,
我试过以下,
for (var i =0;i< arr1.length;i++) {
for (var j = 0;j < arr2.length;j++) {
if (arr1[i].nt !== arr2[j].nt) {
finalArr.push(arr2[j]);
}
}
}
但这个循环耗电2次。任何人都可以建议我这样做最简单的方法。感谢。
答案 0 :(得分:0)
var arr1 = [{'_id':'192983','nt':'1246699993'},{'_id':'192984','nt':'1246699994'}];
var arr2 = [{'title':'ABX1','nt':'2398389'},{'title':'ABX2','nt':'1246699994'}];
let answer = [];
arr2.forEach(x => {
if(!arr1.some(y => y['nt'] === x['nt'])){
answer.push(x)
}
})
console.log(answer)
&#13;
上述答案基于您所写的内容。您希望找到类似的项目,并将其排除,意味着不包括在内,因此结果应为{'title':'ABX1','nt':'2398389'}
但根据您的预期结果,您需要{'title':'ABX2','nt':'1246699994'}
。
无论哪种方式,通过我的解决方案并在if条件内删除!
以获得&#34;预期&#34;输出
或者,您可以使用filter
方法,而不是使用forEach,而不是
let answer = arr2.filter(x=> {
return arr1.some(y=>y['nt']===x['nt']);
});
&#13;
答案 1 :(得分:0)
如果您担心效率低下,请比较以下两种方法:
低效(最大i * j次迭代):
var list1 = [1, 2, 3, 4, 5, 6];
var list2 = ['a', 'b', 'c', 3, 'd', 'e'];
for (var i in list1) {
for (var j in list2) {
if (list1[i] == list2[j]) {
alert('found ' + list1[i] + ' in both lists');
}
}
}
高效(最大i + j次迭代)
var list1 = [1, 2, 3, 4, 5, 6];
var list2 = ['a', 'b', 'c', 3, 'd', 'e'];
var lookup = {};
for (var j in list2) {
lookup[list2[j]] = list2[j];
}
for (var i in list1) {
if (typeof lookup[list1[i]] != 'undefined') {
alert('found ' + list1[i] + ' in both lists');
break;
}
}
一旦您使用字典查找而不是循环遍历两个数组,您只需要实现逻辑以匹配相关键并将它们输出到结果数组。