通过键比较将对象复制到另一个对象

时间:2018-06-23 04:02:07

标签: javascript ecmascript-6

我正在尝试通过比较对象的键将对象复制到另一个对象。根据我的说法,键可以嵌套在任何对象节点上。我仍然需要通过比较它们的key将它们复制到另一个对象中。

它们在对象树中任何级别的对象键。

这可能吗?

这是我的尝试:

var extend = function (original, context, key) {
  for (key in context)
    if (context.hasOwnProperty(key))
      if (Object.prototype.toString.call(context[key]) === '[object Object]')
        original[key] = extend(original[key] || {}, context[key]);
      else
        original[key] = context[key];
  return original;
};

var firstObject = {
    key1 : 'ar',
    key2 : 'value2',
    address:{
    "street" : "D15 Road"
    "sub":{"name":"Stockoverflow"}
    }
};

var secondObject = {
    name:"",
    street:"",
    key3 : 'value3',
    key4 : 'value4'
};
var x = extend(secondObject, firstObject )
console.log( 'extend', x );

在我上面的尝试中,street:"", name:""仍未更新。

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

const source = {
  key1: 'a',
  common1: 'value1',
  a: {
    b: {
      c: {
        common2: 'value2'
      }
    }
  }
};

const dest = {
  key2: 'b',
  common1: null,
  common2: null
};

function extend(dest, source) {
  Object.entries(source).forEach(([key, value]) => {
    if (typeof value === 'object') {
      extend(dest, value);
    } else if (dest.hasOwnProperty(key)) {
      dest[key] = value;
    }
  });
}

extend(dest, source);
console.log(dest);

基本上,遍历它们只有两个选择:它是一个对象或它的键匹配。

如果它是一个对象,我们只需递归调用extend。如果键匹配,则我们设置值。

如果您希望能够使用对象作为值来执行此操作(即common1可以是对象而不是原始对象),只需在if语句中切换两者即可。