1. ホーム
  2. javascript

[解決済み] ネストしたオブジェクトのプロパティを動的に設定する

2022-05-15 09:39:11

質問

任意の深さのレベルを持つことができ、任意の既存のプロパティを持つことができるオブジェクトがあります。 たとえば

var obj = {
    db: {
        mongodb: {
            host: 'localhost'
        }
    }
};

その上で、以下のようにプロパティを設定(または上書き)したいと思います。

set('db.mongodb.user', 'root');
// or:
set('foo.bar', 'baz');

ここで、プロパティ文字列は任意の深さを持つことができ、値は任意のタイプ/ものにすることができます。

プロパティキーがすでに存在する場合、値としてオブジェクトと配列はマージされる必要はありません。

前の例では、次のようなオブジェクトが生成されます。

var obj = {
    db: {
        mongodb: {
            host: 'localhost',
            user: 'root'
        }
    },
    foo: {
        bar: baz
    }
};

このような機能を実現するにはどうしたらよいでしょうか?

どのように解決するのですか?

この関数は、指定された引数を使用して、データを追加/更新するために obj コンテナのデータを追加/更新します。 の中のどの要素が追加されたかを記録しておく必要があることに注意してください。 obj スキーマのどの要素がコンテナで、どれが値(文字列、intsなど)なのかを把握しておかないと例外が発生することに注意してください。

obj = {};  // global object

function set(path, value) {
    var schema = obj;  // a moving reference to internal objects within obj
    var pList = path.split('.');
    var len = pList.length;
    for(var i = 0; i < len-1; i++) {
        var elem = pList[i];
        if( !schema[elem] ) schema[elem] = {}
        schema = schema[elem];
    }

    schema[pList[len-1]] = value;
}

set('mongo.db.user', 'root');