我需要能够在运行时合并两个(非常简单)JavaScript对象。例如,我想:

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }

obj1.merge(obj2);

//obj1 now has three properties: food, car, and animal

是否有一种内置的方法来实现这一点?我不需要递归,也不需要合并函数,只需要平面对象上的方法。


当前回答

可以使用Object.assign方法。例如:

var result = Object.assign(obj1, obj2);

此外,请注意,它会创建对象的浅副本。

其他回答

您可以使用对象排列语法来实现这一点。这是ES2018及以后的一部分。

constobj1={food:“pizza”,car:“ford”};const obj2={animal:“狗”};常量obj3={…obj1,…obj2};console.log(obj3);

使用object.assign和spread运算符合并两个对象。

错误的方式(修改原始对象,因为目标是o1)

var o1 = { X: 10 };
var o2 = { Y: 20 };
var o3 = { Z: 30 };
var merge = Object.assign(o1, o2, o3);
console.log(merge)  // {X:10, Y:20, Z:30}
console.log(o1)     // {X:10, Y:20, Z:30}

正确的方式

Object.assign({},o1,o2,o3)==>以新对象为目标{…o1,…o2,…o3}==>扩展对象

变量o1={X:10};var o2={Y:20};var o3={Z:30};console.log('不修改原始对象,因为目标{}');var merge=对象赋值({},o1,o2,o3);console.log(合并);//{X:10,Y:20,Z:30}控制台日志(o1)console.log('不修改原始对象')var spreadMerge={…o1,…o2,…o3};console.log(spreadMerge);控制台日志(o1);

Harmony ECMAScript 2015(ES6)指定了将执行此操作的Object.assign。

Object.assign(obj1, obj2);

当前的浏览器支持越来越好,但如果您正在为没有支持的浏览器开发,则可以使用polyfill。

对象.assign()

ECMAScript 2015(ES6)

这是一项新技术,是ECMAScript 2015(ES6)标准的一部分。这项技术的规范已经定稿,但请查看兼容性表,了解各种浏览器中的用法和实现状态。

assign()方法用于将所有可枚举自身财产的值从一个或多个源对象复制到目标对象。它将返回目标对象。

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, target object itself is changed.

我使用Object.create()来保持默认设置(使用__proto__或Object.getPrototypeOf())。

function myPlugin( settings ){
    var defaults = {
        "keyName": [ "string 1", "string 2" ]
    }
    var options = Object.create( defaults );
    for (var key in settings) { options[key] = settings[key]; }
}
myPlugin( { "keyName": ["string 3", "string 4" ] } );

这样我以后就可以一直使用“concat()”或“push()”。

var newArray = options['keyName'].concat( options.__proto__['keyName'] );

注意:为了避免重复,需要在连接之前进行hasOwnProperty检查。