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

2020/11/16 16:42 · javascript ·  · 0评论

我厌倦了总是不得不编写这样的代码:

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

或者,如果我不想自己编写代码,请实现一个已经执行过的库。当然,ES6 +即将解救,这将为我们提供类似aObject.prototype.extend(obj2...)Object.extend(obj1,obj2...)

那么ES6 +是否提供这种功能?如果尚不存在,那么是否计划了此类功能?如果没有计划,那为什么不呢?

您将可以使用Object.assign在ES6中进行浅层合并/扩展/分配:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

句法:

Object.assign(targetsources);

其中... sources表示源对象。

例:

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.assign(),

希望这会有所帮助,这也会进行DEEP合并:

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

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

尽管它尚未出现在ES6草案中,但似乎对此有很多支持,因此我认为它将很快出现在草案中。

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};

也许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/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/defineProperties

本文地址:http://javascript.askforanswer.com/ruhezaies6-zhongjianglianggejavascriptduixianghebingzaiyiqi.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!