为了账号安全,请及时绑定邮箱和手机立即绑定

仅使用属性访问器(点符号或括号符号),如何直接设置未定义的嵌套属性?

仅使用属性访问器(点符号或括号符号),如何直接设置未定义的嵌套属性?

墨色风雨 2021-08-20 14:37:58
在 javascript 对象中,是否可以仅使用属性访问器(例如点符号或括号符号)来设置未定义嵌套键的属性值?Lodash 的 _.set 函数(和 TJ Crowder 的回答)和我想要的差不多,但是代码的结构不同,即_.set(state, "some.future.key", "baz").是否有任何库可以让我直接设置值,即state.some.future.key = "baz"?理想情况下,我希望状态自动呈现以下形状:state = {    some: {        future: {            key: "baz"        }    }}
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

您只需创建任何缺失的东西。


const state = {

    foo: "bar"

};


if (!state.some) {

    state.some = {};

}

if (!state.some.future) {

    state.some.future = {};

}

state.some.future.key = "baz";

console.log(state);

如果有很多内联代码,您可以为自己提供一个函数来完成它。如果你想这样做,这个问题和这个问题的答案应该会让你朝着正确的方向前进。一个简单的版本:


function setDeep(obj, path, value) {

    if (typeof path === "string") {

        path = path.split(".");

    }

    const final = path[path.length - 1];

    path = path.slice(0, -1);

    for (const entry of path) {

        if (!obj[entry]) {

            obj = obj[entry] = {};

        } else {

            obj = obj[entry];

        }

    }

    return obj[final] = value;

}


const state = {

    foo: "bar"

};

setDeep(state, "some.future.key", "baz");

// Or: setDeep(state, ["some", "future", "key"], "baz");

console.log(state);

...但有十几种变化。


查看完整回答
反对 回复 2021-08-20
  • 3 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信