javascript nested object merge
javascript nested object merge

deep copy
Object reference type
function namespace(oNamespace, sPackage) {
  // deep copy
  let res = oNamespace;
  const arr = sPackage.split(".");
  //  ["a", "b", "c", "d"]
  const len = arr.length;
  for(let key of arr){
    if(key in oNamespace){
      if(typeof oNamespace[key] !== "object"){
        oNamespace[key] = {};
      } else {
        // except
      }
    } else {
      oNamespace[key] = {};
    }
    // ? 引用类型
    oNamespace = oNamespace[key];
    console.log(`\noNamespace ${key}`, JSON.stringify(oNamespace))
    console.log(`res`, JSON.stringify(res))
    // console.log(`oNamespace ${key}`, oNamespace)
    // console.log(`\nres`, res)
  }
  console.log(`\noNamespace`, oNamespace)
  console.log(`result =`, JSON.stringify(res))
  return res;
}
// namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
/*
// oNamespace a {"test":1,"b":2}
// res {"a":{"test":1,"b":2}}
// oNamespace b {}
// res {"a":{"test":1,"b":{}}}
// oNamespace c {}
// res {"a":{"test":1,"b":{"c":{}}}}
// oNamespace d {}
// res {"a":{"test":1,"b":{"c":{"d":{}}}}}
// oNamespace {}
// result = {"a":{"test":1,"b":{"c":{"d":{}}}}}
*/
shallow copy bug
Object.assign / {...obj, ...obj2}
function namespace(oNamespace, sPackage) {
  const arr = sPackage.split(`.`).reverse();
  // const arr = 'a.b.c.d'.split(`.`).reverse();
  let obj = {};
  for(let k of arr) {
    obj = {[k]: obj}
  }
  // shallow copy bug
  return Object.assign(oNamespace, obj);
  // return obj;
}
function namespace(oNamespace, sPackage) {
  const arr = sPackage.split(`.`).reverse();
  // const arr = 'a.b.c.d'.split(`.`).reverse();
  let obj = {};
  for(let k of arr) {
    obj = {[k]: obj}
  }
  // shallow copy bug
  return {...oNamespace, ...obj};
  // return obj;
}
deep copy OK
// deep merge objects
function isObject(item) {
  return (item && typeof item === 'object' && !Array.isArray(item));
}
function mergeDeep(target, ...sources) {
  if (!sources.length) return target;
  const source = sources.shift();
  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 mergeDeep(target, ...sources);
}
demo
function namespace(oNamespace, sPackage) {
  const arr = sPackage.split(`.`).reverse();
  // const arr = 'a.b.c.d'.split(`.`).reverse();
  let obj = {};
  for(let k of arr) {
    obj = {[k]: obj}
  }
  return Object.assign({}, oNamespace, obj);
  // return obj;
}
obj = namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
function namespace(oNamespace, sPackage) {
  const arr = sPackage.split(`.`).reverse();
  // const arr = 'a.b.c.d'.split(`.`).reverse();
  let obj = {};
  for(let k of arr) {
    obj = {[k]: obj}
  }
  // return Object.assign({}, oNamespace, obj);
  return obj;
}
undefined
obj = namespace({a: {test: 1, b: 2}}, 'a.b.c.d')

refs
根据包名,在指定空间中创建对象
Returning Object Literals from Arrow Functions in JavaScript
https://github.com/lydiahallie/javascript-questions#98-whats-the-output
https://github.com/lydiahallie/javascript-questions/issues/220#issuecomment-523736303

const getList = ([x, ...y]) => [x, y];
const getUser = user => { name: user.name; age: user.age; }
const list = [1, 2, 3, 4];
const user = { name: "Lydia", age: 21 };
console.log(getList(list));
console.log(getUser(user));
//  [1, Array(3)]
// undefined
https://mariusschulz.com/blog/returning-object-literals-from-arrow-functions-in-javascript

xgqfrms 2012-2020
www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
javascript nested object merge的更多相关文章
- JavaScript Nested Function 的时空和身份属性
		
JavaScript 的function 不仅仅是一等公民,简直就是特殊公民.它有许多独特的特征: 1) 它是object,可以存储,传递,附加属性. 2) 它可以有lexical closure, ...
 - 从头开始学JavaScript (十一)——Object类型
		
原文:从头开始学JavaScript (十一)--Object类型 一.object类型 一个object就是一系列属性的集合,一个属性包含一个名字(属性名)和一个值(属性值). object对于在应 ...
 - JavaScript中Object的总结
		
基于原型继承,动态对象扩展,闭包,JavaScript已经成为当今世界上最灵活和富有表现力的编程语言之一. 这里有一个很重要的概念需要特别指出:在JavaScript中,包括所有的函数,数组,键值对和 ...
 - JavaScript之Object拆解
		
转载烦请注明原文链接: https://github.com/Xing-Chuan/blog/blob/master/JavaScript/JavaScript%E4%B9%8BObject%E6%8 ...
 - [Functional Programming] Using Lens to update nested object
		
For example, in React application, we have initial state; const data = { nextId: 4, todoFilter: 'SHO ...
 - JavaScript Math Object 数字
		
JavaScript Math Object Math Object The Math object allows you to perform mathematical tasks. Math is ...
 - JavaScript中Object.prototype.toString方法的原理
		
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...
 - 【WIP】客户端JavaScript Web Object
		
创建: 2017/10/11 更新: 2017/10/14 标题加上[WIP],增加[TODO] 更新: 2018/01/22 更改标题 [客户端JavaScript Web Object, UR ...
 - 67.基于nested object实现博客与评论嵌套关系
		
1.做一个实验,引出来为什么需要nested object 冗余数据方式的来建模,其实用的就是object类型,我们这里又要引入一种新的object类型,nested object类型 博客,评论,做 ...
 
随机推荐
- Redis持久化之RDB和AOF
			
Redis是一个键值对数据库服务器,由于Redis是内存数据库,那么有很多内存的特点,例如掉电易失,或者进程退出,服务器中的数据也将消失不见,所以需要一种方法将数据从内存中写到磁盘,这一过程称之为数据 ...
 - proxy_http_version 1.0 | 1.1
			
Module ngx_http_proxy_module http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_ver ...
 - Paginator    Django  分页  When QuerySets are evaluated  QuerySets 执行原理   QuerySets are lazy  惰性执行  访问db取数据的时机
			
https://docs.djangoproject.com/en/2.2/topics/pagination/ Paginator objects¶ The Paginator class has ...
 - 【Coredump】调试之旅
			
测试反馈,core了. 拿到环境,发现6和11,一个是重复释放,一个是非法指针. 用GDB一挂 ,发现 1 GNU gdb (GDB) 7.5 2 Copyright (C) 2012 Free So ...
 - MySQL 数据库性能调优
			
MySQL 数据库性能调优 MySQL性能 最大数据量 最大并发数 优化的范围有哪些 存储.主机和操作系统方面: 应用程序方面: 数据库优化方面: 优化维度 数据库优化维度有四个: 优化选择: 数据库 ...
 - 天融信Top-app LB负载均衡SQL注入0day
			
POST /acc/clsf/report/datasource.php HTTP/1.1 Host: Connection: close Accept: text/javascript, text/ ...
 - 利用selenium抓取网页的ajax请求
			
部门需要一个自动化脚本,完成web端界面功能的冒烟,并且需要抓取加载页面时的ajax请求,从接口层面判断请求是否成功.查阅了很多资料都没有人有过相关问题的处理经验,在处理过程中也踩了很多坑,所以如果你 ...
 - Pytest(4)失败重跑插件pytest-rerunfailures
			
安装: pip3 install pytest-rerunfailures 重新运行所有失败用例 要重新运行所有测试失败的用例,请使用--reruns命令行选项,并指定要运行测试的最大次数: $ py ...
 - 【奇淫巧技】Bypass阿里云注入
			
序言 我:摸鱼一时爽,一直摸鱼一时爽啊:relieved:大佬:还摸鱼,快来搞个注入.我:... 拿到数据包 GET /wxapp.php?i=undefined&t=undefined&am ...
 - P1435 回文字串(DP)
			
题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 "Ab3bd"插 ...