4

オブジェクトを別のオブジェクトに追加する方法が必要です。通常、これは非常に単純です

obj[property] = {'name': bob, 'height': tall}

ただし、問題のオブジェクトはネストされているため、次のものが必要になります。

obj[prop1][prop2] = {'name': bob, 'height': tall}

ただし、決定的なのは、ネスティングが可変であることです。つまり、実行前に各新しいオブジェクトがどれだけ深くネストされるかわからないということです。基本的に、次のようなオブジェクト パスを表す文字列を生成します。

"object.secondObj.secondObj.fourthObj"

次に、4 番目のオブジェクト内にデータを設定する必要がありますが、ブラケット [] メソッドを使用できません。事前に必要なブラケットの数がわからないためです。これを行う方法はありますか?必要に応じてjQueryも使用しています。

4

2 に答える 2

4

確かに、再帰または単純な反復を使用できます。私は再帰の方が好きです。次の例は概念実証を目的としており、おそらく本番環境では使用しないでください。

var setDeepValue = function(obj, path, value) {
    if (path.indexOf('.') === -1) {
        obj[path] = value;
        return;
    }

    var dotIndex = path.indexOf('.');
    obj = obj[path.substr(0, dotIndex)];

    return setDeepValue(obj, path.substr(dotIndex + 1), value);
};

ただし、JavaScript では参照を変更するだけなので、再帰は必要ありません。

var objPath = 'secondObj.thirdobj.fourthObj';
var valueToAdd = 'woot';

var topLevelObj = {};
var attributes = objPath.split('.');
var curObj = topLevelObj;

for (var i = 0; i < attributes.length; i++) {
    var attr = attributes[i];
    if (typeof curObj[attr] === 'undefined') {
        curObj[attr] = {};
    }

    curObj = curObj[attr];

    if (i === (attributes.length - 1)) {
        // We're at the end - set the value!
        curObj['awesomeAttribute'] = valueToAdd;
    }
}
于 2012-08-30T22:15:44.693 に答える
0

文字列を生成する代わりに...

var o="object";
//code
o+=".secondObj";
//code
o+=".thirdObj";
//code
o+=".fourthObj";

...あなたができる

var o=object;
//code
o=o.secondObj;
//code
o=o.thirdObj;
//code
o=o.fourthObj;

次に、次のようにデータを追加できます。

o.myprop='myvalue';

そしてobject、変更に応じて更新されます。

こちらをご覧ください:http://jsfiddle.net/rFuyG/

于 2012-08-30T22:22:54.040 に答える