如何在JavaScript中获取嵌套对象值的键路径数组?
解决方案:递归遍历任意嵌套对象生成路径-值数组
当然可以!这里有一个纯JavaScript的递归解决方案,能够处理任意嵌套深度和任意键名的对象,完美生成你需要的路径-值数组:
function flattenObject(obj) { const result = []; function traverse(currentObj, currentPath = '') { // 遍历当前对象的所有键 for (const key of Object.keys(currentObj)) { const value = currentObj[key]; // 拼接当前路径:如果已有路径就加个点分隔,否则直接用当前键 const newPath = currentPath ? `${currentPath}.${key}` : key; // 判断当前值是否是需要继续遍历的对象(排除null和数组,按需可调整) if (typeof value === 'object' && value !== null && !Array.isArray(value)) { // 递归遍历子对象 traverse(value, newPath); } else { // 叶子节点,添加到结果数组 result.push({ path: newPath, value }); } } } traverse(obj); return result; }
测试示例
用你提供的对象测试一下:
const obj = { some: { thing: { good: 'yo' }, one: 'else' }, something: { bad: 'oy' }, somethingtasty: 'mmm' }; const arr = flattenObject(obj); console.log(arr);
输出结果完全符合你的需求:
[ { path: 'some.thing.good', value: 'yo' }, { path: 'some.one', value: 'else' }, { path: 'something.bad', value: 'oy' }, { path: 'somethingtasty', value: 'mmm' } ]
补充说明
针对你提到的几个问题:
- 关于旧Stack Overflow回答:那个方案可能只处理了固定层级的嵌套,而上面的递归方法会自动探测所有嵌套深度,不管对象结构有多复杂都能处理。
- 关于Lodash:虽然
getpath需要已知路径,但你可以用_.transform结合递归思路实现类似效果,不过纯原生JS的方案更轻量,不需要额外依赖。如果一定要用Lodash,也可以这样写:
const _ = require('lodash'); function flattenWithLodash(obj) { const result = []; _.transform(obj, (acc, value, key, path) => { const fullPath = path.join('.'); if (_.isPlainObject(value)) return; result.push({ path: fullPath, value }); }, null, '.'); return result; }
内容的提问来源于stack exchange,提问作者JT Houk
相关产品推荐
相关产品推荐

