[英]Javascript Set Nested object Keys
代码:
module.exports.set = function (data, key, value) {
if (key.includes(".")) {
let elements = key.split(".");
let element = elements.pop();
let obj = elements.reduce((object, keyy) => {
if (typeof object[keyy] == "undefined") object[keyy] = {};
return object[keyy];
}, data);
obj[element] = value;
return data;
} else {
data[key] = value;
return data;
}
}
我将通过示例向您解释问题。
var obj = {};
set(obj, "hello.world", "test")
console.log(obj)
控制台日志:
{
"hello": {
"world": "test"
}
}
但是如果我写这段代码:
var obj = {
"hello": {
"world": "test"
}
};
set(obj, "hello.world.again", "hello again")
console.log(obj)
object 没有变化。 控制台日志将是这样的:
var obj = {
"hello": {
"world": "test"
}
};
我想要这样的结果:
{
"hello": {
"world": {
"again": "test"
}
}
}
在 lodash 模块中,我可以做我告诉的事情。 但在我的代码中,我不能这样做。 请帮助我,我该怎么做?
我的猜测是你正在寻找
if (typeof object[keyy] != "obect")
而不是
if (typeof object[keyy] == "undefined")
它不会检测到当前是属性值的字符串。
当然调用set(obj, "hello.world.again", "hello again")
会导致{"hello": {"world": {"again": "hello again"}}}
,而不是{"hello": {"world": {"again": "test"}}}
。
我发现你的逻辑是期待一个 JSON object 但接收字符串值,它需要修改一点或设置这样的值{again: 'hello again'} 。
我试着简单地写下这个 set 方法,它可能对某人有帮助!
function set(obj, key, value) { let keys = key.split('.'); if(keys.length<2){ obj[key] = value; return obj; } let lastKey = keys.pop(); let fun = `obj.${keys.join('.')} = {${lastKey}: '${value}'};`; return new Function(fun)(); } var obj = { "hello": { "world": "test" } }; set(obj, "hello.world.again", 'hello again'); // Value should be object here console.log(obj); set(obj, "hello.world.again.onece_again", 'hello once again'); console.log(obj);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.