如何在2个对象数组之间执行过滤

时间:2018-05-31 07:01:59

标签: javascript arrays angularjs for-loop

我有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次。任何人都可以建议我这样做最简单的方法。感谢。

2 个答案:

答案 0 :(得分:0)

&#13;
&#13;
     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;
&#13;
&#13;

上述答案基于您所写的内容。您希望找到类似的项目,并将其排除,意味着不包括在内,因此结果应为{'title':'ABX1','nt':'2398389'}

但根据您的预期结果,您需要{'title':'ABX2','nt':'1246699994'}

无论哪种方式,通过我的解决方案并在if条件内删除!以获得&#34;预期&#34;输出

或者,您可以使用filter方法,而不是使用forEach,而不是

&#13;
&#13;
let answer = arr2.filter(x=> {
    	return arr1.some(y=>y['nt']===x['nt']);
    });
&#13;
&#13;
&#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;
    } 
}

一旦您使用字典查找而不是循环遍历两个数组,您只需要实现逻辑以匹配相关键并将它们输出到结果数组。