在 JSON 中查找键的值,而无需事先知道结构

find the value of a key in a JSON without knowing the structure in advance

本文关键字:先知 结构 JSON 查找      更新时间:2023-09-26

我有以下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结构中的拼写错误

这工作正常

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"]

我认为以下递归解决方案可以达到您的目的。

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