-1

オブジェクトがあり、このオブジェクト内に深くネストされた変数を設定したいとしますが、var はまだ存在しません。これを行う最善の方法は何ですか?たとえば、以下のように、更新する変数の場所を示す文字列があるとします。

var myObject = {};
var location = "myObject.test.myVar";
var value = "My value!";
setValue(location, value, myObject);

これが次のようになることを望みます:

myObject = {
    test: {
        myVar: "My value!"
    }
};

そして、場所はそれよりもはるかに深い場合があります。どんな助けでも大歓迎です!ありがとう!アンドレアス

4

3 に答える 3

2

この関数は、あなたが望むことを行います。
参照によってオブジェクトが変更されることに注意してください。
名はオブジェクト自体であるため、無視されることに注意してください。

function setValue(location, value, object)
{
    var path = location.split(".");
    var current = object;
    for (var i = 1; i < path.length; i++)
    {
        if ((i + 1) == path.length)
            current[path[i]] = value;
        else
        {
            current[path[i]] = {};
            current = current[path[i]];
        }
    }
}
于 2013-09-03T12:30:57.913 に答える
1
var myObject = {};
var location = "test.my.deep.hidden.nested.myVar";
var otherLoc = "test.my.deep.secret.var";
var value = "My value!";

function setValue(location, value, obj){
  var i, prev = obj, curr;
  location = location.split(".");
  for(i = 0; i < location.length - 1; ++i){
    curr = prev[location[i]];
    if("object" !== typeof curr){
      prev[location[i]] = {}
      curr = prev[location[i]];
    }
    prev = curr;
  }
  curr[location[i]] = value;
}

setValue(location, value, myObject);
setValue(otherLoc, 42, myObject);

console.log(JSON.stringify(myObject));

結果:

{
  "test": {
    "my": {
      "deep": {
        "hidden": {
          "nested": {
            "myVar": "My value!"
          }
        },
        "secret": {
          "var":42
        }
      }
    }
  }
}

場所が実際に有効かどうかを確認するなど、いくつかの機能を追加したい場合があることに注意してください ( "this.is..invalid")。

于 2013-09-03T12:30:50.680 に答える