2

次の JavaScript データ構造があります。a[]テキスト文字列を要素とする配列です。何が含まれているかは事前にわかりません。例えば、

a = ["foo", "bar", "baz"...];

res{}次のルールを持つ「a」の要素と同じ数のキーを持つ JSON オブジェクトです。の最後の最も内側のキーがres{}呼び出された配列を持つオブジェクトであるfeatures[]か、最後の最も内側のキー自体が配列です。したがって、 の場合、次resのいずれかです

// if
a = ["foo", "bar"];

// then
res = {
    "foo": {
        "bar": {
            "features": []
        }
    }
};

// and I want
data = res["foo"]["bar"].features;

// or
res = {
    "foo": {
        "bar": []
    }
};

// and I want
data = res["foo"]["bar"];

a[]前述したように、 の長さや要素の値は事前にわかりません。どうすれば上記を行うことができますか?

更新:の構造のタイプミスを修正しましたres

4

2 に答える 2

2

これは正常に動作します

function getFeatures(obj, keys) {
  if( keys.length ) {
    key = keys.shift();
    obj = obj[key];
    return getFeatures(obj, keys);
  } else {
    return obj.features || obj;
  }
}

関数は渡された配列から要素をシフトするため、キー配列のコピーで呼び出すことができます。いえ

var keys = ["foo", "bar"];

var res1  = { "foo": { "bar": { "features": [1, 2, 3] } } };
getFeatures(res1, keys.slice(0)); // => [1, 2, 3]

var res2 = { "foo": { "bar": ["a", "b", "c"] } };
getFeatures(res2, keys.slice(0)); // => ["a", "b", "c"]
于 2012-06-11T03:18:32.317 に答える
0

次の再帰的ソリューションが目的を達成すると思います。

function doSomething(i) {
    if (i==a.length)
        return []; // can be made {features:[]}
    var d = {}
    d[a[i]] = doSomething(i+1);
    return d;
}

doSomething(0);

初期設定が機能の代替反復ソリューション:

var a = ['foo', 'bar'];

var i = a.length -1;
var res,d={features:[]};

while(i >=0) {
    res ={};
    res[a[i]]=d;
    d=res;
    i--;
}

--V

于 2012-06-11T03:12:42.330 に答える