如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

在本文中,苏南大叔要处理一个很常见的nodejs问题,object的深度拷贝,或者说如何合并两个变量。

常见的使用场景就是:在程序体内,写好了一个默认的参数对象,程序体外还允许定制这个参数对象。那么最终的结果,就是上述两个变量的合体了。这就引出了本文的话题:nodejs的对象合并问题。

基本情况

本文的实践对象是:

const _default = {
    a: {
        aa: "aaa",
    bb:{
        "bbb":"bbbb"
    }
    },
    b: "bb"
};
const _diy = {
    a: {
    bb:{
        "bbb":"这里是diy的值"
    }
    }
};
let _shade = {};
// ... 代码放这里。
console.log("result  ",_result);
console.log("shade   ",_shade);
console.log("default ",_default);
console.log("diy     ",_diy);

_shade在这里是个龙套演员,大家请看下面的描述。

nodejs 对象拷贝方案,extend 和 Object.assign 方案对比 - extend
nodejs 对象拷贝方案,extend 和 Object.assign 方案对比(图1-1)

方案一,Object.assign

系统自带的函数方案,不用额外安装。

let _result = Object.assign(_shade, _default, _diy);

结果是:

result   { a: { bb: { bbb: '这里是diy的值' } }, b: 'bb' }
shade    { a: { bb: { bbb: '这里是diy的值' } }, b: 'bb' }
default  { a: { aa: 'aaa', bb: { bbb: 'bbbb' } }, b: 'bb' }
diy      { a: { bb: { bbb: '这里是diy的值' } } }

Object.assign的可以添加无限多参数,但是最终的合并结果,将改变第一个参数。所以大多数情况下,大家都把第一个参数写成一个单独的{},避免误伤其它。也就是说,第一个参数会和最终的函数返回这等同。

Object.assign实现的是个浅层复制,也就是说第二层的属性会出现丢失现象。比如本例中的_default.a.aa就丢失了。

方案二,extend

需要额外安装npm包,npm install extend

const extend = require("extend");
let _result = extend(true, {}, _default, _diy);

结果是:

newsn.net:这里是【评论】可见内容

extend扩展包

  • 第一个参数是个boolean,是控制是否为深层复制的。如果这个值不是true的话,那么就和Object.assign是基本一致的了。
  • 而第二个参数呢,等同于Object.assign的第一个参数,就是个被误伤的无辜群众。

总结

苏南大叔对于nodejs的对象合并情况,总结如下:

extend是大家所需要的,但是使用extend的时候,需要个固定模式,那就是:

result = extend (true,{},........);

重点就是true,{}true表示要深层复制,{}就是龙套演员,避免误伤主要参数的。

更多nodejs的相关经验文章,请点击苏南大叔的链接查看。

 【源码】代码片段及相关软件点此获取

 【js】秘籍文章入口,仅传授于有缘之人   js    node

本站的忠实读者小伙伴,正在阅读下面这些文章:

欢迎转载传播本篇原创文章,转载请保留链接及作者信息。
欢迎指正文字或逻辑错误,将会择优在文末列出您的信息。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

苏南大叔需要你的支持

感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!