如何从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)→ 输出1234getValues("version", response)→ 输出0.1getValues("drinks", response)→ 输出ScotchgetValues("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
相关产品推荐
相关产品推荐

