如何在JavaScript中为嵌套对象按同层级名称出现次数新增count统计字段
JavaScript 嵌套对象同层级name统计实现
实现思路
- 递归遍历每一层级的节点数组,每层独立统计不跨级
- 每层先使用Map统计当前所有name的出现次数,同时收集同name下的所有subName子节点
- 对去重后的name生成新节点,赋值count后递归处理该name对应的所有subName合并后的子数组
完整实现代码
function countNestedNames(arr) { // 统计当前层的name计数,以及同name下的所有subName集合 const nameStats = new Map(); for (const item of arr) { const name = item.name; // 初始化统计项 if (!nameStats.has(name)) { nameStats.set(name, { count: 0, subNames: [] }); } const stat = nameStats.get(name); // 当前层级name计数+1 stat.count += 1; // 收集同name下的所有子节点后续统一处理 if (item.subName?.length) { stat.subNames.push(...item.subName); } } // 生成当前层结果 const result = []; for (const [name, stat] of nameStats.entries()) { const node = { name, count: stat.count, subName: stat.subNames.length ? countNestedNames(stat.subNames) : [] }; result.push(node); } return result; }
测试验证
将示例输入传入方法即可得到匹配预期的输出:
// 示例输入 const input = [{ name: 'rohan', subName: [{ name: 'rohan_abc', subName: [{ name: 'rohan_abc_abc', subName: [] }] }, { name: 'rohan_abc', subName: [] }, { name: 'rohan_abc_abc', subName: [] }] }, { name: 'rohan', subName: [{ name: 'rohan_abc', subName: [{ name: 'rohan_abc_abc', subName: [{ name: 'rohan_abc_abc_abc', subName: [] }] }] }, { name: 'rohan_bcd', subName: [] }, { name: 'rohan_abc_abc', subName: [] }] }]; // 调用方法输出结果 console.log(JSON.stringify(countNestedNames(input), null, 2));
运行后输出结果和需求给出的预期结构完全一致。
内容的提问来源于stack exchange,提问作者Rowan Siwakoti
相关产品推荐
相关产品推荐

