繁体   English   中英

使用javascript获取每个级别的json值

[英]Get json values for each level using javascript

我正在尝试使用递归函数使用javascript从简单的json获取最后一个键值

我有这个json

{
  'a': {
    'b': {
      'c': 12,
      'd': 'Hello World'
    },
    'e': [1,2,3]
  }
}

我的预期结果是:

{
  'a/b/c': 12,
  'a/b/d': 'Hello World',
  'a/e': [1,2,3]
}

我正在尝试:

function getDeepKeys(obj) {
    var keys = [];
    for (var key in obj) {
        keys.push(key);
        if (typeof obj[key] === "object") {
            var subkeys = getDeepKeys(obj[key]);
            keys = keys.concat(subkeys.map(function (subkey) {
                return key + "/" + subkey;
            }));
        }
    }
    return keys;
} 

但是由于某种原因,它返回了我:

a/b/c/d/e/0/1/ ,我不确定为什么要在其中添加这些数字。 有人对我该怎么做有一个想法?

我认为您可能使其变得比必要的更为复杂。 您可以使用Array.isArray和非对象( typeof !== 'object )测试数组, Array.isArray返回路径和值。 否则,递归每个条目。 reduce()对此很有用。 将当前路径作为参数传递给递归函数也很方便:

 let obj = {'a': {'b': {'c': 12,'d': 'Hello World'},'e': [1,2,3]}} function getValues(obj, path = []){ return (Array.isArray(obj) || typeof obj !== 'object') ? {[path.join('/')]: obj} : Object.entries(obj).reduce((acc, [key, val]) => Object.assign(acc, getValues(val, path.concat(key)) ) , {}) } console.log(getValues(obj)) 

您可以使用显式堆栈进行迭代,该堆栈的开销比递归少,并且不会破坏调用堆栈:

 const pathify = o => { const paths = {}; const stack = [[o, []]]; while (stack.length) { const [curr, path] = stack.pop(); for (const k in curr) { if (typeof curr[k] === "object" && !Array.isArray(curr[k])) { stack.push([curr[k], path.concat(k)]); } else { paths[`${path.join("/")}/${k}`] = curr[k]; } } } return paths; }; console.log(pathify({'a':{'b':{'c':12,'d':'Hello World'},'e':[1,2,3]}})); 

您可以使用Object.keys函数来循环对象的键,并且可以递归地遍历嵌套的对象。

 let obj = {'a': {'b': {'c': 12,'d': 'Hello World'},'e': [1,2,3]}}, result = Object.create(null), loop = function (o, arr, result) { Object.keys(o).forEach(k => { arr.push(k); if (typeof o[k] === 'object' && !Array.isArray(o[k])) loop(o[k], arr, result); else result[arr.join('/')] = o[k]; arr.splice(-1); }); }; loop(obj, [], result); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM