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

根据包名,在指定空间中创建对象

https://www.nowcoder.com/practice/a82e035501504cedbe881d08c824a381?tpId=2&&tqId=10854&rp=1&ru=/ta/front-end&qru=/ta/front-end/question-ranking

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

https://stackoverflow.com/questions/28770415/ecmascript-6-arrow-function-that-returns-an-object/57601889#57601889



xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


javascript nested object merge的更多相关文章

  1. JavaScript Nested Function 的时空和身份属性

    JavaScript 的function 不仅仅是一等公民,简直就是特殊公民.它有许多独特的特征: 1) 它是object,可以存储,传递,附加属性. 2) 它可以有lexical closure, ...

  2. 从头开始学JavaScript (十一)——Object类型

    原文:从头开始学JavaScript (十一)--Object类型 一.object类型 一个object就是一系列属性的集合,一个属性包含一个名字(属性名)和一个值(属性值). object对于在应 ...

  3. JavaScript中Object的总结

    基于原型继承,动态对象扩展,闭包,JavaScript已经成为当今世界上最灵活和富有表现力的编程语言之一. 这里有一个很重要的概念需要特别指出:在JavaScript中,包括所有的函数,数组,键值对和 ...

  4. JavaScript之Object拆解

    转载烦请注明原文链接: https://github.com/Xing-Chuan/blog/blob/master/JavaScript/JavaScript%E4%B9%8BObject%E6%8 ...

  5. [Functional Programming] Using Lens to update nested object

    For example, in React application, we have initial state; const data = { nextId: 4, todoFilter: 'SHO ...

  6. JavaScript Math Object 数字

    JavaScript Math Object Math Object The Math object allows you to perform mathematical tasks. Math is ...

  7. JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...

  8. 【WIP】客户端JavaScript Web Object

    创建: 2017/10/11   更新: 2017/10/14 标题加上[WIP],增加[TODO] 更新: 2018/01/22 更改标题 [客户端JavaScript Web Object, UR ...

  9. 67.基于nested object实现博客与评论嵌套关系

    1.做一个实验,引出来为什么需要nested object 冗余数据方式的来建模,其实用的就是object类型,我们这里又要引入一种新的object类型,nested object类型 博客,评论,做 ...

随机推荐

  1. Linux网卡没有eth0显示ens33原因以及解决办法

    原因 首先说明下eth0与ens33的关系: 目前的主流网卡为使用以太网络协定所开发出来的以太网卡 (Ethernet),因此我们 Linux 就称呼这种网络接口为 ethN (N 为数字). 举例来 ...

  2. Hash Join: Basic Steps

    Joins https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm#TGSQL242 tidb/index_lookup_hash_join ...

  3. Microsoft Windows的消息循环

    https://zh.wikipedia.org/wiki/Microsoft_Windows的訊息迴圈 微软视窗操作系统是以事件驱动做为程序设计的基础.程序的线程会从操作系统获取消息.应用程序会不断 ...

  4. Redis 雪崩、穿透和击穿

    https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-caching-avalanche-and ...

  5. 九鼎S5PV210开发板的SD卡启动、uboot tftp升级内核镜像

    Note: 我的S5PV210板子的磁盘是emmc版本,不是nandflash版本. 1. SD卡内烧录uboot镜像,然后作为启动盘来启动emmc中的内核镜像和根文件系统. 只要破坏emmc内的ub ...

  6. loj10010糖果传递

    题目描述 原题来自:HAOI 2008 有 n 个小朋友坐成一圈,每人有 a_i 颗糖果.每人只能给左右两人传递糖果.每人每次传递一颗糖果的代价为 1 .求使所有人获得均等糖果的最小代价. 输入格式 ...

  7. 高性能数据导入方案&表过滤器&一对多支持筛选- .NET SqlSugar ORM

    一.数据导入有哪些难题 1.数据分类 你需要将 插入.更新.忽略不计.错误数据 等进么分类汇总,最后返回给客户,如果没有很好的设计想把这些操作一步到位非常的难 2.高性能 对于插入或者更新 肯定不能单 ...

  8. python 基础二-----数据类型和控制语句

    一.数据类型: 1)数据类型 1.整数(int) 2.浮点数(float) 3.字符串(string) 4.列表(list) 5. 元组(tuple) 6.字典(dict): key和value是一一 ...

  9. Spring MVC—模型数据,转发重定向,静态资源处理方式

    Spring MVC处理模型数据 添加模型数据的方法 ModelAndView Map及Model SessionAttribute ModelAttribute Spring MVC转发和重定向 S ...

  10. js创建javaMap

    /** * Simple Map * var m = new Map(); * m.put('key','value'); * var v_otherMap = v_m.toMapString();* ...