繁体   English   中英

Javascript 设置嵌套 object 键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM