两个对象中的常见对象

时间:2017-07-27 19:52:39

标签: javascript jquery

此函数返回两个对象之间的diff,我需要修改它以返回公共对象。任何帮助表示赞赏。

数组示例:

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
}

3 个答案:

答案 0 :(得分:0)

这不是您的代码,但以下函数将通过探索具有两个forEach()循环的两个数组来返回所有匹配。算法复杂度由array1.length * array2.length给出。不要用于大型阵列!但这是最简单的思考方式。事实上,我想到的第一个想法是检查array1的每个元素是否为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))
&#13;
&#13;
&#13;

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

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

答案 1 :(得分:0)

如果你想要的只是寻找两个数组中相同的东西,你只需要遍历其中一个。这些方面应该有用:

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 :(得分:0)

要查找具有公共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; }