如何在 ES6 + 中合并两个 javascript 对象?

我已经厌倦了总是写这样的代码:

function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false )  continue;
obj1[key] = obj2[key]
}
}

或者,如果我不想自己编写代码,那么实现一个已经完成的库。当然 ES6 + 正在为我们提供类似于 Object.prototype.extend(obj2...)Object.extend(obj1,obj2...)的东西

那么 ES6 + 是否提供了这样的功能呢?如果还没有,那么这种功能是否已经计划好了?如果不是计划好的,那为什么不呢?

101686 次浏览

也许 ES5Object.defineProperties方法可以完成这项工作?

例如:。

var a = {name:'fred'};
var b = {age: {value: 37, writeable: true}};


Object.defineProperties(a, b);


alert(a.age); // 37

MDN 文档: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties

目前正在讨论增加 Object.mixin以处理您要求的行为

虽然它还没有出现在 ES6的草案中,但似乎有很多人支持它,所以我认为它很快就会出现在草案中。

在 ES6中,您可以通过使用 Object.sign 来执行浅层合并/扩展/分配:

Https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/object/assign

句法:

分配(目标消息来源) ;

其中 消息来源表示源对象。

例如:

var obj1 = {name: 'Daisy', age: 30};
var obj2 = {name: 'Casey'};


Object.assign(obj1, obj2);


console.log(obj1.name === 'Casey' && obj1.age === 30);
// true

你可以使用 对象扩展语法对象扩展语法:

const merged = {...obj1, ...obj2}

对于数组,扩展运算符已经是 ES6(ES2015)的一部分,但是对于对象,扩展运算符被添加到 ES9(ES2018)的语言规范中。它的提议在很久以前就被默认使用在诸如 Babel 这样的工具中了。

我知道这是一个老问题,但 ES2015/ES6中最简单的解决方案实际上非常简单,使用 Object.sign () ,

希望这能有所帮助,这也能合并 很深:

/**
* Simple is object check.
* @param item
* @returns {boolean}
*/
export function isObject(item) {
return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
}


/**
* Deep merge two objects.
* @param target
* @param source
*/
export function mergeDeep(target, source) {
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return target;
}

示例用法:

mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }

ES6

Object.assign(o1,o2) ;
Object.assign({},o1,o2) ; //safe inheritance
var copy=Object.assign({},o1); // clone o1
//------Transform array of objects to one object---
var subjects_assess=[{maths:92},{phy:75},{sport:99}];
Object.assign(...subjects_assess); // {maths:92,phy:75,sport:99}

ES7或者 Babel

{...o1,...o2} // inheritance
var copy= {...o1};