在不事先知道结构的情况下在JSON中查找键的值

时间:2012-06-11 02:52:08

标签: javascript json

我有以下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

结构中的拼写错误

2 个答案:

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