4

プログラムで「hello」を「hey」に変更したいのですが、ソリューションはネストされた要素の数に関係なく機能するはずです(単純にするために2つのレベルを使用しています)。

var data = {level1: {level2 : 'hello' }};

「data」変数、パス (「level1/level2」)、および新しい値 (「hey」) にアクセスできます。

私はやろうとしました:

var parents = 'level1/level2'.split('/');
var target = data;
for(var i=0; i<parents.length; i++){
   target = data[parents[i]];
}
target = 'hey';

アイデアは、ルートに移動することでした

target = data

次に 1 レベルの深さ

target = data['level1'] 

...立ち止まるな

target = data['level1']['level2'] //data['level1'] === target

そして内容を修正

target = 'hey'

しかし、(target = target['level2']) を実行すると、元のオブジェクト (データ) への参照が失われるように見えます。

パスを使用して文字列を作成し、それを評価できると思います。

eval("data['level1']['level2']='hey');

eval() を含まないより良い解決策はありますか?

4

2 に答える 2

4

2つの問題があります。1つは、ループ内で使用し続けるdataことです。つまり、内部キーではなく、最上位のキーにアクセスしようとしています。target = data[parents[i]];に変更

target = target[parents[i]];

2つ目は、変数を変更する場合、変数を変更するのではなく、代わりにtarget変更することです。1回前にループから脱退した場合は、参照として保存されているオブジェクトを更新できます。datatarget

for(var i=0; i<parents.length-1; i++){
   target = target[parents[i]];
}
target[parents[i]] = 'hey';

デモ: http: //jsfiddle.net/Lherp/

于 2012-08-20T07:00:04.230 に答える
1

次のようなことを試してください:

var data = {level1: {level2 : 'hello' }};
var parents = 'level1/level2'.split('/');
var target = data;
for(var i=0; i < parents.length - 1; i++){
   target = target[parents[i]];
}
target[parents[i]] = 'hey';

または、何か不足していますか?

編集:何かが欠けていました(申し訳ありませんが、最初にテストする必要がありました..)

于 2012-08-20T06:56:03.313 に答える