我有以下JavaScript数据结构。 a[]
是一个以文本字符串作为元素的数组。它不是
事先知道它包含什么。例如,
a = ["foo", "bar", "baz"...];
res{}
是一个JSON对象,其键数与" a"中的元素一样多。遵守以下规则; res{}
的 last 最里面的键是一个对象
一个名为features[]
的数组或 last 最内层的键本身就是一个数组。那么,如果,则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
答案 0 :(得分:2)
这没关系
function getFeatures(obj, keys) {
if( keys.length ) {
key = keys.shift();
obj = obj[key];
return getFeatures(obj, keys);
} else {
return obj.features || obj;
}
}
您可能想要使用keys-array的副本来调用它,因为该函数会将元素移出它传递的数组。即。
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"]
答案 1 :(得分: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