Javascript设置嵌套对象键

代码:


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)

对象没有变化。控制台日志将是这样的:


var obj = {

    "hello": {

        "world": "test"

    }

};

我想要这样的结果:


{

    "hello": {

        "world": {

            "again": "test"

        }

    }

}

在 lodash 模块中,我可以做我所说的事情。但在我的代码中,我不能这样做。请帮助我,我该怎么做?


德玛西亚99
浏览 165回答 2
2回答

浮云间

我的猜测是你正在寻找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"}}}。

慕村9548890

我发现您的逻辑需要一个 JSON 对象但接收字符串值,它需要修改一点或设置像这样的值{again: 'hello again'}。我试着简单地写下这个set 方法,它可能对某人有帮助!function set(obj, key, value) {&nbsp; let keys = key.split('.');&nbsp; if(keys.length<2){ obj[key] = value; return obj; }&nbsp; let lastKey = keys.pop();&nbsp; let fun = `obj.${keys.join('.')} = {${lastKey}: '${value}'};`;&nbsp; return new Function(fun)();}var obj = {&nbsp; &nbsp; "hello": {&nbsp; &nbsp; &nbsp; &nbsp; "world": "test"&nbsp; &nbsp; }};set(obj, "hello.world.again", 'hello again'); // Value should be object hereconsole.log(obj);set(obj, "hello.world.again.onece_again", 'hello once again');console.log(obj);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript