【问题标题】:How perform filter between 2 array of objects如何在 2 个对象数组之间执行过滤
【发布时间】:2018-05-31 07:01:58
【问题描述】:

我有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]);
              }
      }
}

但是这个循环需要 n 次幂。谁能给我建议最简单的方法。谢谢。

【问题讨论】:

  • 你会得到哪个结果?那是通缉令吗?请添加想要的结果。
  • “我想排除那个数学化'nt' olum”你键盘上的c键坏了吗?
  • @Nina Sholz,添加了加速结果。
  • @Robby,是的,不幸的是:(。

标签: javascript arrays angularjs for-loop


【解决方案1】:

     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)

上面的答案是基于你写的。您希望找到相似的项目并将其排除,即不包含因此结果应为{'title':'ABX1','nt':'2398389'}

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

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

或者,您可以使用filter 方法而不是使用forEach,如下所示

let answer = arr2.filter(x=> {
    	return arr1.some(y=>y['nt']===x['nt']);
    });

【讨论】:

    【解决方案2】:

    如果您担心效率低下,请比较以下两种方法:

    低效(最多 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;
        } 
    }
    

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

    【讨论】:

    • 在上述情况下不惜一切代价避免For...In:p
    • 我确信它可以优化,但我强调了 Testimg198 版本的 O(N2) 复杂度与我的第二个示例的 O(N) 复杂度之间的区别。这似乎是他们问题的主要部分。
    猜你喜欢
    • 2019-10-14
    • 2023-02-08
    • 2020-01-27
    • 2022-01-15
    • 1970-01-01
    • 2022-12-12
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多