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类型 博客,评论,做 ...
随机推荐
- secure hashes message digests 安全哈希 消息摘要
hashlib --- 安全哈希与消息摘要 - Python 3.8.3 文档 https://docs.python.org/zh-cn/3.8/library/hashlib.html hashl ...
- 为什么要使用 do while(0)?
两点 避免宏定义的花括号对代码的完整性造成影响 可以在指定的代码块中(do{})使用break提前跳出,避免goto.
- Java 类的加载与初始化
本文结构: 1.先看几道题 2.类的加载于初始化 (1)类的加载 (2)类的初始化 (a)会发生类的初始化的情况 (b)不会发生类的初始化的情况 首先看几道题. 解析可在看完讲解后再看 Demo1 p ...
- ThinkPHP 5.0.24 反序列化RCE (Windows下EXP)
直接上exp吧,Windows下. <?php namespace think\process\pipes; class Windows { private $files = []; publi ...
- Language Guide (proto3) | proto3 语言指南(开篇)
前言 近日在学习gRPC框架的相关知识时接触到Protobuf(protocol-buffers,协议缓冲区),proto3等知识.网上很多文章/帖子经常把gRPC与proto3放在一起,为避免初学者 ...
- HTMl5 特点 标签语法 以及标签
知识点关于HTML5 的特点以及其标签和标签语法.. <!-- [HTMl5 特点] 向下兼容 用户至上 化繁为简 无插件范围 访问通用性 引入语义 引入原生媒体支持--> <!-- ...
- spark SQL (一)初识 ,简介
一, 简介 Spark SQL是用于结构化数据处理的Spark模块.与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了关于数据结构和正在执行的计算的更多信息.在内部 ...
- 区域之间PA、FortiGate内网互联专线、IPSec互备方案
网络拓扑: 现状描述: 办公区和IDC之间有防火墙互联的点对点专线实现内网互通,现需要两地防火墙构建IPSec VPN作为专线的热备链路. 解决方案: 飞塔侧 1.按照阶段一.阶段二建立IPSec V ...
- 深入理解nodejs的HTTP处理流程
目录 简介 使用nodejs创建HTTP服务 解构request 处理Request Body 处理异常 解构response 简介 我们已经知道如何使用nodejs搭建一个HTTP服务,今天我们会详 ...
- NodeMCU获取并解析心知天气信息
NodeMCU获取并解析心知天气信息 1 注册心知天气并获取私钥 打开心知天气网站,点击注册按钮 填写基本信息注册心知天气账号,登录注册所填写的邮箱点击链接进行账号激活,随后出现如下界面 点击登录按钮 ...