javascript - 遍历对象获取键和所有父键

标签 javascript json recursion tree traversal

遍历树(json),使用JS实现getKeys(data, str)函数。获取 key 和所有 parent key 。

const data = {
  key1: 'str1',
  key2: {
    key3: 'str3',
    key4: 'str4',
    key5: {
      key6: 'str6',
      key7: 'str7',
      key8: 'str8',
    },
  }
}

例如:

getKeys(数据, 'str1'); 返回:'key1'

getKeys(数据, 'str3'); 返回:'key2,key3'

getKeys(数据, 'str6'); 返回:'key2,key5,key6'

我认为可以通过递归来完成,但是怎么做呢?

这是我的解决方案,但失败了

let s = [];
function getKeys(data, str, key='') {
  if (key !== '') {
    s.push(key);
  }
  for (item in data) {
    if (typeof data[item] === 'object') {
      getKeys(data[item], str, item);
    } else if (data[item] === str) {
      s.push(item);
      return s;
    }
  }
  return s;
}

最佳答案

您的代码的问题在于它无条件地填充“已找到”列表,无论该值是否实际上在当前处理的分支下。考虑例如:

data = {
    a: 1,
    b: {
        c: 2
    },
    d: {
        e: {
            e1: 3,
            e2: 33,
        },
        f: {
            f1: 4,
            f2: 44,
        },
    }
};

当执行 getKeys(data, 44) 时,返回将是 [ 'b', 'd', 'e', 'f', 'f2' ],这是不正确的。

您需要做的是检查该值是否确实在当前节点下,只有在答案为是时才添加当前键。示例:

function getKeys(obj, val) {
    if (!obj || typeof obj !== 'object')
        return;

    for (let [k, v] of Object.entries(obj)) {
        if (v === val)
            return [k];
        let path = getKeys(v, val);
        if (path)
            return [k, ...path];

    }
}

关于javascript - 遍历对象获取键和所有父键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57746065/

相关文章:

algorithm - 递归和 DFS 等价吗?

java - 如何在 Java 中保留插入顺序、恒定时间检索和动态调整大小

javascript - 如何在没有尾调用优化的情况下用函数式编程替代方法替换 while 循环?

json - NodeJS 从流中反序列化

android - 如何在android中获取json数组值?

perl - 使用 Perl,如何重命名驱动器所有子目录中的文件?

javascript - `Parse.Object` 的钩子(Hook)或过滤器?

javascript:如何解析日期字符串

c++ - 在 C++ 中访问 JSON 值

java - 总和为 N 且逆数总和为 1 的所有自然数