给定对象:

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

我如何复制属性在另一个对象(secondObject)像这样:

var secondObject = {
    key1 : 'value1',
    key2 : 'value2',
    key3 : 'value3',
    key4 : 'value4'
};

使用对firstObject的引用?就像这样:

var secondObject = {
    firstObject,
    key3 : 'value3',
    key4 : 'value4'
};

(这行不通……我把它放在大行中只是为了显示我想如何组织代码)。

不使用任何JavaScript框架的解决方案是否可行?


当前回答

根据ES6 -扩展语法:

你可以简单地使用:

const thirdObject = {
   ...firstObject,
   ...secondObject   
}

这避免了通过引用传递这些对象的问题。

此外,它还负责具有深度嵌套的对象。

其他回答

使用属性扩展符号。它是在ES2018中添加的(数组/可迭代对象的扩展是更早的ES2015), {…firstObject}将所有可枚举的属性展开为离散的属性。

let secondObject = {
      ...firstObject,
      key3 : 'value3',
      key4 : 'value4'
    }

对象。赋值或析构可能会给您带来很大的麻烦,因为只有顶级属性被复制为值。

所有嵌套的属性都将被复制为引用,并保留对原始对象属性的引用。如果你的物体是平的,那是可以的。但如果不是,这些方法很少适用。

对于最简单有效的一行程序,我会推荐deepmerge包,它没有这个缺点。

const newObject = deepmerge({}, oldObjectWithNestedProperties);

这将给你oldObjectWithNestedProperties的完全分离和独立的newObject副本。

在这里玩死灵法师,因为ES5带来了Object.keys(),有可能将我们从所有这些. hasownproperty()检查中拯救出来。

Object.keys(firstObject).forEach(function(key) {
  secondObject[key] = firstObject[key];
});

或者,将它包装成一个函数(lodash _.assign()的有限“拷贝”):

function assign(object, source) {
  Object.keys(source).forEach(function(key) {
    object[key] = source[key];
  });
}

assign(secondObject, firstObject); // assign firstObject properties to secondObject

Object.keys()是一个相对较新的方法,最值得注意的是:在IE < 9中不可用。同样的情况也适用于. foreach()数组方法,我用它来代替常规的for循环。

幸运的是,这些古老的浏览器有ES5 -shim可用,它将填充许多ES5特性(包括这两个)。

(我完全支持填充程序,而不是拒绝使用很酷的新语言特性。)

声明一下,现在也可以用

var firstObject = {
    key1 : 'value1',
    key2 : 'value2'
};

var secondObject = {
    ...firstObject,
    key3 : 'value3',
    key4 : 'value4'
};

从@ bardzuievny的回答中得到启发,ES6提供了一个本地解决方案:Object.assign()函数!

用法很简单:

Object.assign(secondObject, firstObject);

就是这样!

目前的支持显然很差;只有Firefox(34+)可以开箱即用,而Chrome(45+)和Opera(32+)需要设置“实验性标志”。

支持正在改进,最新版本的Chrome、Firefox、Opera、Safari和Edge都支持它(显然IE不支持)。转译器也可用,如Babel和Traceur。请看这里了解更多细节。