1

以下を考えると:

var a = JSON.parse('{"fst":"data1","snd":{"ind2":"data2"}}');
var index = "fst";
var res = a[index]; //res = data1
var index2 = "????";
var res2 = a[index2]; //res = data2

index2私は何をres2着るべきですdata2か?

インデックス文字列を変更するだけで、解析されたjsonの任意のレベルで要素を取得できる汎用構文を探しています。

(テーブルを構築するために、json 派生オブジェクトのさまざまな場所/レベルからの要素のリストをループしています)

どんな助けでも大歓迎です

4

3 に答える 3

2

プロパティのプロパティにアクセスしており、構文はこれを反映しています。

var res = a['snd']['ind2'];

「ネストされた」プロパティを直接取得する方法はありません。元のオブジェクトを変更できる場合は、オブジェクトごとにショートカットアクセサーを追加できます。

//Credit goes to Esailja for the original
function deepAccess(obj) {
    function nestedAccess(o, level) {
        if (typeof o == "object") {
            var level = level || "";
            for (p in o) {
                if (o.hasOwnProperty(p)) {
                    if (level && typeof(o[p]) != "object") {
                        obj[level + "." + p] = o[p];
                    }
                    nestedAccess(o[p], (level ? level + "." : "") + p);
                }
            }
        }
    }
    nestedAccess(obj);
}

deepAccess(a);

a["snd.ind2"];
于 2012-11-23T18:21:51.673 に答える
2

そのための関数が必要です

function deepAccess( obj, str ) {
    var parts = str.split("."),
        cur = obj;
    for( var i = 0; i < parts.length; ++i ) {
        cur = cur[parts[i]];    
    }

    return cur;
}

var index = "fst";
deepAccess( a, index ); //"data1"
index = "snd.ind2";
deepAccess( a, index ); //"data2"
于 2012-11-23T18:25:27.260 に答える
1
var someObject1 = {};
var someObject2 = {e01: '*', e02: {e03: '*', e04: '*'}, e05: '*'};
var someObject3 = {e01: {e02: {e03: '*'}}};

function setValueByPath(obj, path, value) {
    var pathArray = path.split('.');

    function goDownstears(o, chunk, val) {
        var prop = chunk.shift();

        if(!o.hasOwnProperty(prop)) o[prop] = {};

        o[prop] = (chunk.length > 0) ? goDownstears(o[prop], chunk, val) : val;

        return o;
    }

    obj = goDownstears(obj, pathArray, value);
}

setValueByPath(someObject1, 'e01.e02.e03', 'changed');

setValueByPath(someObject2, 'e02.e04', 'changed');

setValueByPath(someObject3, 'e01.e02.e03', 'changed');
setValueByPath(someObject3, 'e01.e02.e04', 'changed');
setValueByPath(someObject3, 'e02.e01.e01', 'changed');

console.log(someObject1);
console.log(someObject2);
console.log(someObject3);

私の質問はここで閉じられました obj['level1.level2.leve3'] = value のような砂糖でオブジェクトプロパティを設定します

ここを参照してくださいhttp://jsfiddle.net/zafod/RDGwY

この問題は値を設定するためのものですが、繰り返しを通じて要求されたプロパティを返すことができます

于 2012-11-26T15:39:59.660 に答える