Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-比较对象并在新对象中存储差异_Javascript_Object_Properties_Compare - Fatal编程技术网

Javascript-比较对象并在新对象中存储差异

Javascript-比较对象并在新对象中存储差异,javascript,object,properties,compare,Javascript,Object,Properties,Compare,我将给出两个对象的简化版本,其中包含嵌套对象: 目标1: {firstname: 'John', lastname: 'Cena', privateInfo: {privateProperty1: false, privateProperty2: true}} 目标2: {firstname: 'John', middlename: 'Felix', lastname: 'Pina', privateInfo: {privateProperty1: true, privateProperty2

我将给出两个对象的简化版本,其中包含嵌套对象:

目标1:

{firstname: 'John', lastname: 'Cena', privateInfo: {privateProperty1: false, privateProperty2: true}}
目标2:

{firstname: 'John', middlename: 'Felix', lastname: 'Pina', privateInfo: {privateProperty1: true, privateProperty2: true} }
在比较Object1和Object2之后,我想将Object2拥有的所有不同属性存储在一个新对象中。就我而言,这将是:

let Object3 = {middlename: 'Felix', lastname: 'Pina', privateInfo: {privateProperty1: true}}
比较这些对象(包括嵌套对象和缺少对象)的所有属性的最佳和最有效的方法是什么


在我的例子中,对象的属性可以达到30-40。效率在这里非常重要。

只需在对象键上循环,并将它们与其他对象进行比较。由于可能存在嵌套对象,因此需要递归:

function difference(object, other) {
  var diff = {};
  for(var key in object) {
    if(typeof object[key] === "object" && typeof other[key] === "object" && object[key] && other[key]) {
      diff[key] = difference(object[key], other[key]);
    } else if(object[key] !== other[key]) {
      diff[key] = object[key];
    }
  }
  return diff;
}
示例:

功能差异(对象、其他){
var diff={};
for(对象中的变量键){
if(对象的类型[键]==“对象”&&typeof其他[键]===“对象”&&object[键]&&other[键]){
diff[key]=差异(对象[key],其他[key]);
}else if(对象[键]!==其他[键]){
diff[key]=对象[key];
}
}
返回差;
}
var object1={firstname:'John',lastname:'Cena',privateInfo:{privateProperty1:false,privateProperty2:true}};
var object2={firstname:'John',middlename:'Felix',lastname:'Pina',privateInfo:{privateProperty1:true,privateProperty2:true};

log(差异(object2,object1))MVP的可能副本。工作得很有魅力。谢谢你,先生!