使用 lodash 合并 2 个对象,但使用点表示法
Use lodash to merge 2 objects but with dot notation
我正在使用 lodash 合并 2 个对象。因为第二个要合并的对象我不知道它是否可能包含一个点表示法字符串对象。(不知道更好的词吗?
简单(工作)示例:
_.merge({person:{name: 'Marc', age: 28}}, {person:{name: 'Timo'}});
// This will return {person:{name: 'Timo', age: 28}}
但是现在使用点表示法:
_.merge({person:{name: 'Marc', age: 28}}, {'person.name': 'Timo'});
// This will return {person:{name: 'Marc', age: 28}, person.name: 'Timo'}
这不是预期的结果 - 我什至不知道这应该如何与一个对象中的键 person.name 两次一起工作。
您在两个示例中使用的第二个参数并不相同。当您想在对象键中使用点时,您需要在大小写中引用键名(person.name
)。
因此,第一个示例中的对象具有一个键person
,该键指向具有name
键的对象。相比之下,第二个示例中的对象具有一个名为 person.name
的键,该键是不同的。访问第二个样本上的person
键将返回undefined
。
一个小帮手
function setPath(obj, path, value){
if(typeof path === "object"){
//you might want to change this part to lodash
return Object.keys(path)
//sort ASC by key-length
//to make sure that the key `person` would be processed
//before processing `person.name`
.sort((a,b)=>a.length-b.length)
//apply keys
.reduce((o, k) => setPath(o, k, path[k]), obj);
}
var parts = String(path).split(".");
for(var i = 0, last = parts.length-1, ctx = obj; i<last; ++i, ctx = v){
var k = parts[i], v = ctx[k];
if(v !== Object(v)){
//you might want to throw an error, or to ignore these cases
//it's up to you
if(v != null) console.error("overwriting non null property at path: " + parts.slice(0, i+1).join("."));
//simple
v = ctx[k] = {};
/*
//check the next key, if it is an uint,
//then this should probably be an Array
var w = parts[i+1];
//check wether w contains an uint32
v = ctx[k] = (+w === (w>>>0))? []: {};
*/
}
}
ctx[parts[last]] = value;
return obj;
}
和用法
var a = { person: { name: "Marc", age: 28 } };
var b = { "person.name": "Timo" };
JSON.stringify(setPath(a, b), null, 2);
相关文章:
- JQuery合并了keyup和focusout两个函数
- React中的数据集表示
- JSON重构(合并内容)与javascript
- Javascript-根据赋值顺序,按键合并对象数组
- 合并两个数组,重新调整循环js
- 如何合并不同集合的游标并按日期排序
- 合并TinyMCE(jQuery插件)文件
- 任何将(SSH)终端嵌入到一些HTML5表示系统中的想法(例如,show.js)
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- 如何将Date字段设置为等于另一个Date+Int值,该值表示月份值
- 如何循环通过2个对象数组并通过匹配id进行合并
- 将两个Json提要合并为一个,并按时间排序
- 将项目履行与高级模板合并,并通过电子邮件发送至Netsuite 2.0
- DataTables合并了两个独立表中的jQuery/Javascript函数
- regex表示逗号,后跟空格或仅逗号
- 承诺合并流
- 如何使用javascript合并两个对象数组
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 我将如何将其更改为循环和数组表示法
- 使用 lodash 合并 2 个对象,但使用点表示法