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

基于递归的深层键结构:如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:32:57