基于递归的深层键结构:如何用Lodash获取值为字符串的深层键路径?
获取嵌套对象中值为字符串的深层键路径
嘿,我太懂这种卡了半天找解决方案的感觉!既然你已经是Lodash的老用户,喜欢_.get和_.set,那咱们可以基于Lodash的工具函数快速实现你要的功能——遍历嵌套对象(包括数组),收集所有最终值为字符串的键路径。
实现思路
核心就是递归遍历每个层级的键:
- 遇到字符串值,就记录当前的完整路径
- 遇到嵌套的对象或数组,就继续深入遍历,拼接路径(数组用
[索引]格式,对象用.键名格式) - 用Lodash的类型判断函数来确保兼容性,避免原生类型判断的坑
代码实现
const getStringPaths = (obj, parentPath = '') => { let paths = []; // 用_.forEach遍历,兼容对象和数组 _.forEach(obj, (value, key) => { // 根据当前是数组还是对象,拼接正确的路径片段 const currentPath = parentPath ? (Array.isArray(obj) ? `${parentPath}[${key}]` : `${parentPath}.${key}`) : key; // 判断当前值是否为字符串 if (_.isString(value)) { paths.push(currentPath); } // 如果是嵌套的纯对象或数组,继续递归遍历 else if (_.isPlainObject(value) || _.isArray(value)) { paths = paths.concat(getStringPaths(value, currentPath)); } // 其他类型(数字、布尔、null等)直接忽略 }); return paths; };
测试你的示例对象
把你的测试对象放进去试试:
const myObject = { a: 'myObject.a', b: { ba: 'myObject.b.ba', bb: ['myObject.b.bb[0]'], }, c: [ { ca: 'myObject.c[0].ca' }, ], }; // 如果需要路径前缀(比如加上myObject.),直接传parentPath参数 const result = getStringPaths(myObject, 'myObject'); console.log(result);
输出结果正好是你要的:
["myObject.a", "myObject.b.ba", "myObject.b.bb[0]", "myObject.c[0].ca"]
适配深层嵌套
这个函数完全支持更深的嵌套结构,不管你实际场景里的对象有多少层,只要是对象或数组嵌套,都能准确遍历到所有值为字符串的路径。
内容的提问来源于stack exchange,提问作者mdmb
相关产品推荐
相关产品推荐

