如何将多维对象数组扁平化处理为一维对象数组?
多维嵌套对象数组扁平化解决方案
你需要的是将嵌套层级中的_id属性逐层合并,最终生成每个底层节点对应一条完整层级id的一维数组。单纯用flatMap()只能展开数组结构,无法完成跨层级的属性合并,这里用递归的方式可以完美解决:
通用递归实现方案
function flattenData(data) { const result = []; function traverse(node, parentAttrs = {}) { // 提取当前节点所有带_id的属性(自动适配parent/child/grand_child等层级) const currentAttrs = Object.fromEntries( Object.entries(node).filter(([key]) => key.includes('_id')) ); // 合并父级属性与当前节点属性 const mergedAttrs = {...parentAttrs, ...currentAttrs}; if (node.child && node.child.length) { // 存在子节点,递归遍历子节点并传递已合并的属性 node.child.forEach(child => traverse(child, mergedAttrs)); } else { // 无嵌套子节点,将合并后的属性对象加入结果数组 result.push(mergedAttrs); } } // 遍历顶层数组的每个父节点 data.forEach(item => traverse(item)); return result; } // 测试使用 let data = [ { parent_id: 1, name: "parent 1", child: [ { child_id: 3, name: "child 1", child: [ { grand_child_id: 5, name: "grand child 1" }, { grand_child_id: 6, name: "grand child 2" }, ], }, ], }, { parent_id: 2, name: "parent 2", child: [ { child_id: 4, name: "child ", child: [ { grand_child_id: 7, name: "grand child 3" }, { grand_child_id: 8, name: "grand child 4" }, ], }, ], }, ]; const result = flattenData(data); console.log(result);
结合flatMap的简化写法
如果偏好链式调用风格,也可以用flatMap结合递归实现:
function flattenNode(node, parentAttrs = {}) { const currentAttrs = Object.fromEntries( Object.entries(node).filter(([key]) => key.includes('_id')) ); const mergedAttrs = {...parentAttrs, ...currentAttrs}; return node.child?.length ? node.child.flatMap(child => flattenNode(child, mergedAttrs)) : [mergedAttrs]; } const result = data.flatMap(item => flattenNode(item));
关键逻辑说明
- 属性提取与合并:通过过滤
_id结尾的属性,自动适配不同层级的id字段,避免硬编码层级名称; - 递归遍历:每一层节点都会将已合并的上层属性传递给子节点,确保底层节点能收集到完整的层级id;
- 终止条件:当节点没有
child数组时,说明到达最底层,将合并后的对象加入结果数组。
内容的提问来源于stack exchange,提问作者Abin_S
相关产品推荐
相关产品推荐

