gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:00:58 25 4
gpt4 key购买 nike

遍历树(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com