亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅使用屬性訪問器(點符號或括號符號),如何直接設置未定義的嵌套屬性?

僅使用屬性訪問器(點符號或括號符號),如何直接設置未定義的嵌套屬性?

墨色風雨 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 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號