You need to enable JavaScript to run this app. 如何从JavaScript对象动态获取任意指定深层嵌套值(适配Angular 支持数组遍历)
优惠活动
大模型
产品
解决方案
定价
更多

如何从JavaScript对象动态获取任意指定深层嵌套值(适配Angular 支持数组遍历)

无第三方依赖的嵌套取值函数(适配Angular列渲染场景)

你现有实现的核心问题是路径遍历采用单链reduce逻辑,碰到数组时只会取数组本身的属性,不会自动展开数组内的所有元素作为后续路径的取值入口,因此不带下标的数组路径会直接返回undefined。

实现思路

保留你之前写的混合格式路径解析逻辑(兼容点号、方括号两种写法),把单值遍历的reduce逻辑替换为「候选值集合遍历」:每取完一段路径,就把结果里的所有数组元素无限拉平,作为下一段路径的取值来源,可支持任意层级的数组嵌套,不需要硬编码数组下标。

完整可运行代码

/**
 * 按列映射路径从源行数据提取匹配值,自动展开任意层级嵌套数组
 * @param {string} mapping 列映射路径,支持点号、方括号混合写法
 * @param {object} source 源数据行对象
 * @returns {string} 排序、去重后的拼接字符串,可直接用于列单元格渲染
 */
function getValues(mapping, source) {
  // 统一拆分混合格式的路径为纯路径段数组
  const pathSegments = mapping
    .replace(/]/g, "")
    .split("[")
    .flatMap(segment => segment.split("."))
    .filter(Boolean);

  let pendingValues = [source];
  for (const pathKey of pathSegments) {
    const nextLayerValues = [];
    for (const node of pendingValues) {
      if (node == null) continue;
      const matchedValue = node[pathKey];
      if (matchedValue != null) nextLayerValues.push(matchedValue);
    }
    // 无限拉平数组,自动展开所有层级的嵌套数组元素
    pendingValues = nextLayerValues.flat(Infinity);
  }

  // 去重、排序后输出
  return [...new Set(pendingValues)].sort().join(", ");
}

匹配示例场景的输出验证

用你提供的测试数据运行,输出和你列的预期要求一致:

  • getValues("id", response) → 输出1234
  • getValues("version", response) → 输出0.1
  • getValues("drinks", response) → 输出Scotch
  • getValues("interests[categories]", response) → 输出baseball, books, football, movies,覆盖interests数组下所有元素的categories值
  • getValues("interests[refreshments][drinks]", response) → 输出beer, coffee, soft drink, tea,自动遍历interests数组下的所有元素,提取嵌套的drinks值后去重
  • getValues("goals.maxCalories.drinks", response) → 输出350

适配特性

  • 纯原生JS实现,无任何第三方依赖,可直接在Angular组件、自定义管道、服务中使用,不存在Object-Scan这类第三方包的Angular版本兼容问题
  • 不需要改动现有已配置的列映射规则,不管之前配置的是点号写法还是方括号写法都可以正常识别
  • 自动适配任意层级的数组嵌套,不管数组在路径的哪一层、嵌套多少层,都会自动展开所有元素取值,不需要手动加固定数组下标
  • 内置去重、排序逻辑,输出格式可直接绑定到列单元格的展示值,不需要额外做后处理

内容的提问来源于stack exchange,提问作者Tall_Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 16:15:03