【问题标题】:Common objects in two objects两个对象中的共同对象
【发布时间】:2017-07-27 19:52:38
【问题描述】:

这个函数返回两个对象之间的差异,我需要修改它以返回普通对象。任何帮助表示赞赏。

数组示例:

var array1 = [{
  "Name": "Single",
  "URL": "xxx",
  "ID": 123
}, {
  "Name": "Double",
  "URL": "yyy",
  "ID": 888
}, {
  "Name": "Triple",
  "URL": "zzz",
  "ID": 567
}];

var arrar2 = [{
  "Name": "Single",
  "URL": "xxx",
  "ID": 123
}, {
  "Name": "Double",
  "URL": "yyy",
  "ID": 888
}, {
  "Name": "index",
  "URL": "zzz",
  "ID": 567
}];

// expected result
var resultArray = [{
  "Name": "Single",
  "URL": "xxx",
  "ID": 123
}, {
  "Name": "Double",
  "URL": "yyy",
  "ID": 888
},
}];

当前代码:

function objDiff(array1, array2) {
  var resultArray = []

  array2.forEach(function(destObj) {
    var check = array1.some(function(origObj) {
      if (origObj.name == destObj.name) return true
    })
    if (!check) {
      destObj.desc = 'missing in source'
      resultArray.push(destObj)
    }
  })

  array1.forEach(function(origObj) {
    var check = array2.some(function(destObj) {
      if (origObj.name == destObj.name) return true
    })
    if (!check) {
      origObj.desc = 'missing in destination'
      resultArray.push(origObj)
    }
  })

  return resultArray
}

【问题讨论】:

  • 还提供一些示例对象来测试它怎么样。
  • 您需要说明您当前的思维过程是什么。我们需要知道您正在批判性地思考您的问题。在当前状态下,您将失去所有代表,因为这听起来像是“我必须修改此代码,但我不知道如何,请为我完成我的工作”。而不是“我对 x、y、z 很好奇,我尝试过 a、b 和 c”。
  • 我添加了示例对象

标签: javascript jquery


【解决方案1】:

如果你只想在两个数组中寻找相同的东西,你只需要循环其中一个。这些方面的东西应该可以工作:

function objSame(array1, array2) {
    var resultArray = []

    array2.forEach(function(destObj) {
        var check = array1.some(function(origObj) {
            if(origObj.name == destObj.name) return true
        })
        if(check) {
            destObj.desc = 'Same in both'
            resultArray.push(destObj)
        }
    })
    return resultArray
}

【讨论】:

    【解决方案2】:

    要查找具有共同Name 属性值的数组元素,您可以使用Map 来避免O(n²) 时间复杂度。该映射将使第一个数组中的对象以它们的名称为键。将其作为this 对象传递给第二个数组上的filter

    function objCommon(array1, array2) {
        return array2.filter(function (obj) {
            return this.has(obj.Name);
        }, new Map(array1.map(obj => [obj.Name, obj])));
    }
    
    var array1= [
      { "Name": "Single", "URL": "xxx", "ID": 123 }, 
      { "Name": "Double", "URL": "yyy", "ID": 888}, 
      { "Name": "Triple", "URL": "zzz", "ID": 567 }];
    
    var array2= [
      { "Name": "Single", "URL": "xxx", "ID": 123 }, 
      { "Name": "Double", "URL": "yyy", "ID": 888 }, 
      { "Name": "index", "URL": "zzz", "ID": 567 }];
    
    var result = objCommon(array1, array2);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      这不是您的代码,但以下函数将通过使用两个 forEach() 循环探索两个数组来返回所有匹配项。算法复杂度由array1.length * array2.length 给出。不要用于大型阵列!但这是最容易想到的方法。事实上,我想到的第一个想法是检查 array2 的每个元素与 array1 的每个元素并进行比较。

      var array1 = ['DETE', 'Ivany', 'James', 'Don', 'Crakcer']
      var array2 = ['Jamies', 'Ivanyy', 'DETE', 'Don']
      
      function objMatch(array1,array2) {
        
         var matches = [];
        
         array1.forEach(function(element1) {
         
            array2.forEach(function(element2) {
            
               if(element1 == element2) {
                  
                  matches.push(element1);
                  
               }
            
            });
         
         });
      
        return matches;
      
      }
      
      console.log(objMatch(array1, array2));
      // will return ['DETE', 'Don'] 

      另一种只使用一个循环的方法是使用sort(),感谢jeremy

      var array1 = ["cat", "sum","fun", "run", "gut"];
      var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
      
      var arrayMatch = function(array1, array2) {
      
        var matches = [];
        
        array1.sort();
        array2.sort();
        
        for (var i = 0; i < array1.length; i += 1) {
        
          if (array2.indexOf(array1[i]) > -1) {
            matches.push(array1[i]);
          }
        }
        
        return matches;
      
      }
      console.log(arrayMatch(array1,array2))

      另一种方法是使用Array.prototype.filter,感谢Paul S.

      var array1 = ['DETE', 'Ivany', 'James', 'Don', 'Crakcer']
      var array2 = ['Jamies', 'Ivanyy', 'DETE', 'Don']
      
      function arrayMatch(array1, array2) {
          var t;
          if (array1.length > array2.length) t = array2, array2 = array1, array1 = t;
          
          return array1.filter(function (e) {
              return array2.indexOf(e) > -1;
          });
      }
      
      console.log(arrayMatch(array1, array2));

      【讨论】:

        猜你喜欢
        • 2013-08-28
        • 1970-01-01
        • 2021-08-09
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        相关资源
        最近更新 更多