当然,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 +也提供这样的function吗? 如果不在那里,那么是否计划了这样的function? 如果没有计划,那为什么不呢?

6 Solutions collect form web for “当然,ES6 +必须有一种方法来合并两个JavaScript对象,它是什么?”

您将能够通过使用Object.assign在ES6中进行浅层合并/扩展/分配:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

句法:

Object.assign( target… sources );

其中… sources表示源对象。

注意:不要将语法定义中的…源与ES6扩展运算符混淆。

例:

 var obj1 = {name: 'Daisy', age: 30}; var obj2 = {name: 'Casey'}; Object.assign(obj1, obj2); console.log(obj1.name === 'Casey' && obj1.age === 30); // true 

你可以使用对象rest/传播这个:

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

ECMAScript 提议目前处于阶段3,并且通过使用阶段3预设在Babel中启用。

目前正在讨论添加Object.mixin来照顾你所要求的行为。 https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.html

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

我知道这是一个老问题,但ES2015 / ES6最简单的解决scheme其实很简单,使用Object.assign(),

希望这有助于,这也做深度合并:

 /** * 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] } } } 

也许ES5的Object.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

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或巴别

 {...o1,...o2} // inheritance var copy= {...o1}; 
  • JavaScript中的“function *”是什么?
  • “this”在ES6的箭头函数中提到了什么?
  • 使用ES6语法和dynamicpath导入模块
  • 如何模拟一个ES6模块的import?
  • 从常规的ES6类方法调用静态方法
  • 无法访问事件处理程序中的React实例(this)
  • 在JavaScript中映射vs对象
  • 反引号调用一个函数
  • Visual Studio 2015 JSX / ES2015语法高亮显示
  • 我怎样才能在Javascript中使用默认导入?
  • 什么`返回函数*(){...}`是什么意思?