当然,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? 如果没有计划,那为什么不呢?
您将能够通过使用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};