【问题标题】:Finding an array's objects that are not present in another array by property通过属性查找另一个数组中不存在的数组对象
【发布时间】:2026-01-18 18:45:01
【问题描述】:

我正在寻找一种方法来根据该对象的 属性 查找一个数组中不存在于另一个数组中的任何对象。使用 jQuery 或下划线的最佳方法是什么?

举个例子:

"array1":[
    {"testProperty":"A"}, 
    {"testProperty":"B"}, 
    {"testProperty":"C"}
]

"array2":[
    {"testProperty":"A", "User":"Smith"}, 
    {"testProperty":"B", "User":"Smith"}, 

]

我想从 array1 返回第三个对象,其 testProperty 是“C”,因为它不存在于 array2 中。

我可以在 * 上找到几个关于此问题的示例,但在需要使用这些对象的属性时却找不到。

【问题讨论】:

    标签: javascript jquery arrays underscore.js


    【解决方案1】:

    我不确定这是否重要,但如果你可以使用 lodash 代替下划线,那么有一个很好的函数叫做 differenceBy:

    var _ = require("lodash");
    
    var array1 = [
      {"testProperty":"A"},
      {"testProperty":"B"},
      {"testProperty":"C"}
    ]
    
    var array2 = [
      {"testProperty":"A", "User":"Smith"},
      {"testProperty":"B", "User":"Smith"}
    ]
    
    var result = _.differenceBy(array1, array2, function(item) {
      return item["testProperty"]
    });
    
    console.log(result);
    

    【讨论】:

      【解决方案2】:

      纯 Javascript 提案,带有用于查找的哈希表。

      var data = { "array1": [{ "testProperty": "A" }, { "testProperty": "B" }, { "testProperty": "C" }], "array2": [{ "testProperty": "A", "User": "Smith" }, { "testProperty": "B", "User": "Smith" }, ] },
          result = data.array1.filter(function (a) {
              return !this[a.testProperty];
          }, data.array2.reduce(function (r, a) {
              r[a.testProperty] = true;
              return r;
          }, Object.create(null)));
      
      document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

      【讨论】:

      • 我更喜欢 jQuery 方法,但这很好用,谢谢!
      • @Haymak3r jQuery 方法?那有什么意思?这些答案都不需要jQuery。
      【解决方案3】:

      您可以将filtermap 一起使用

      var a = {'array1': [{"testProperty":"A"}, {"testProperty":"B"}, {"testProperty":"C"}], 'array2': [{"testProperty":"A", "User":"Smith"}, {"testProperty":"B", "User":"Smith"}]};
      
      var result = a.array1.filter(function(e) {
        return a.array2.map(el => { return el.testProperty}).indexOf(e.testProperty) == -1;
      });
      
      console.log(result);

      【讨论】:

      • 这是非常低效的。您在 filter 的每次迭代中映射所有 array2,这是完全没有必要的。
      【解决方案4】:

      这是一个使用过滤器和一些方法的纯 es6 js 版本:

      array1 = [
          {"testProperty":"A"}, 
          {"testProperty":"B"}, 
          {"testProperty":"C"}
      ];
      
      array2 =[
          {"testProperty":"A", "User":"Smith"}, 
          {"testProperty":"B", "User":"Smith"}, 
      
      ]
        
       var r = array1.filter(x =>
          ! Object.keys(x).some(z =>
            array2.some(w =>
            Object.keys(w).some(y => y === z && w[y] === x[z])
          )));
          
          document.write(JSON.stringify(r))

      【讨论】:

        【解决方案5】:

        你可以使用下划线的rejectsome 来得到你想要的:

        var result = _.reject(array1, item => _.some(array2, {testProperty: item.testProperty}));
        

        如果性能是一个问题并且 testProperty 是 array2 中对象的唯一键,那么您可以使用 indexBy 创建一个哈希并使用 has 检查结果:

        var hash = _.indexBy(array2, 'testProperty');
        var result = _.reject(array1, item => _.has(hash, item.testProperty));
        

        【讨论】:

        • 感谢分享 Gruff,很高兴看到实现相同功能的几种不同方法。
        最近更新 更多