2

キーに基づいて値を検索し、その値を別の値に置き換えることができる関数を作成しようとしています。キーは JSON の開始ノードからのツリーです。これが例です。

var myData = {
    name : 'Dan',
    address: {
        city : 'Santa Clara',
                details : {
                   'prevhouse' : ''
                }
    }
}

関数への入力はキー ツリーです。例: myData-address-details-prevhouse

このキーに「Texas」などの新しい値を渡すと、前の家の値が送信している新しい値に変更されます。

新しいJSONは

var myData = {
    name : 'Dan',
    address: {
        city : 'Santa Clara',
                details : {
                   'prevhouse' : 'Texas'
                }
    }
}

ここまで書いたのは

var tree = key.split("-");

現在、ツリー変数には ["myData","address", "details","prevhouse"] が含まれています

myData[tree[0]][tree[1]][tree[2]] を使用してオブジェクトにアクセスできることはわかっていますが、解析された値から動的に取得することはできません。

深さの長さは実行時までわからないため、これを動的に生成するにはどうすればよいですか。

助けを得たいと思っています。

4

4 に答える 4

4

このコードで試してください:

    var myData = {
        name: 'Dan',
        address: {
            city: 'Santa Clara',
            details: {
                prevhouse: ''
            }
        }
    };


    function setAttribute(obj, key, value) {
        var i = 1,
            attrs = key.split('-'),
            max = attrs.length - 1;

        for (; i < max; i++) {
            attr = attrs[i];
            obj = obj[attr];
        }

        obj[attrs[max]] = value;
        console.log('myData=', myData);

    }

    setAttribute(myData, "myData-address-details-prevhouse", "Texas");

ここでは動作中の jsfiddle デモです。結果についてはコンソールを参照してください

于 2012-12-21T03:33:22.817 に答える
1

次のようなことができます:

function update(node, path, value) {
  path = path.split('-');
  do {
    node = node[path.splice(0, 1)];
  } while(path.length > 1);
  node[path[0]] = value;
}
于 2012-12-21T03:25:56.223 に答える
1

JSON は単なる JS オブジェクトであるため、各キーを反復処理できるはずです。したがって、各キーを調べて、定義されているかどうかを確認し、定義されている場合は、そのオブジェクトを次のチェックに使用します。それはあなたが行きたいところにあなたを連れて行きます。最後のキーを値に設定することに注意してください。

設定を扱わない基本的な擬似コード:

obj = data;
for (key in keys) {
  obj = obj[key]
}
于 2012-12-21T03:08:33.720 に答える
0

それがオブジェクトであることを考えると、配列の最初の項目 myDataを使用して破棄する必要があると思います。myData[tree[1]][tree[2]][tree[3]]

このようなものは再帰的に機能するはずです(テストされていません)

function updateValue(obj, key, value)
{
   var keys = key.split('-');
   updateObjectValue(obj, keys.shift(), value);
}

function updateObjectValue(obj, keyArray, value)
{
     if (keyArray.length == 1) {
         obj[keyArray[0]] = value;
     }
     else if (keyArray.length > 1) {
         updateObject(obj[keyArray[0]], keyArray.shift(), value);
     }
}
于 2012-12-21T03:02:57.163 に答える