You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:03:03