2

我有以下 JavaScript 数据结构。a[]是一个以文本字符串为元素的数组。事先不知道它包含什么。例如,

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

res{}是一个 JSON 对象,其键与“a”中的元素一样多,规则如下;的最后一个最里面的键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;
  }
}

您可能希望使用键数组的副本来调用它,因为该函数会将元素从它传递的数组中移出。IE

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 回答