如何修改JS递归函数获取嵌套对象中所有匹配键值对的路径
修改思路
原函数存在两个问题:
- 递归调用时参数顺序传反,会导致匹配逻辑错误
- 找到第一个匹配项就直接返回,没有收集全量结果
修改时我们可以在每次函数调用时初始化结果数组,遍历当前层级所有键值对,收集子层级返回的匹配路径以及当前层级的匹配路径,最终返回全量结果即可。
修改后代码
function getPath(obj, givenKey, givenValue) { // 初始化数组存储所有匹配路径 const results = []; for (let key in obj) { // 处理数组/对象类型的值,递归查找 if (obj[key] && typeof obj[key] === "object") { // 参数顺序和函数定义保持一致,避免原函数的传参错误 const childResults = getPath(obj[key], givenKey, givenValue); // 子级返回的每个路径都拼接上当前层级的key childResults.forEach(path => { path.unshift(key); results.push(path); }) } // 当前键值对匹配目标,直接存入结果 else if (key === givenKey && obj[key] === givenValue) { results.push([key]); } } return results; }
测试效果
调用getPath(myObj, "name", "needle")会直接返回你需要的结果:
[ [0, "name"], ["2", "children", "0", "children", "1", "children", "0", "name"] ]
额外说明
如果不需要数字类型的数组索引(比如希望所有路径项都是字符串),可以在unshift的时候将key转为字符串:path.unshift(String(key))即可。
内容的提问来源于stack exchange,提问作者employee
相关产品推荐
相关产品推荐

