如何为无限深度数组对象计算sum并添加percent字段
实现无限深度数组对象的百分比计算(递归方案)
直接上可运行的递归实现代码,核心逻辑是分层计算总和,再递归处理子节点:
function addPercentToTree(arr) { // 计算当前层级所有元素的defaultWeight总和 const sumArray = arr.reduce((total, item) => total + item.defaultWeight, 0); // 处理总和为0的边界情况,避免除以0报错 if (sumArray === 0) { return arr.map(item => { const newItem = {...item, percent: 0}; // 递归处理子数组(这里假设子数组字段为children,可根据你的数据结构修改) if (item.children && Array.isArray(item.children)) { newItem.children = addPercentToTree(item.children); } return newItem; }); } return arr.map(item => { const newItem = { ...item, // 计算百分比,保留两位小数,按需调整精度 percent: (item.defaultWeight / sumArray * 100).toFixed(2) }; // 递归处理子节点 if (item.children && Array.isArray(item.children)) { newItem.children = addPercentToTree(item.children); } return newItem; }); }
使用示例
假设你的数据结构如下(子数组字段为children):
const sampleData = [ { id: 1, defaultWeight: 50, children: [ { id: 11, defaultWeight: 20 }, { id: 12, defaultWeight: 30 } ] }, { id: 2, defaultWeight: 50 } ]; // 转换后的数据 const result = addPercentToTree(sampleData); console.log(result);
关键说明
- 分层计算:每一层只计算当前层级所有元素的
defaultWeight总和,确保百分比是基于当前层级的占比,而非全局总和。 - 纯函数设计:使用扩展运算符复制原对象,不会修改原始数据,避免副作用。
- 边界处理:加入了总和为0的判断,防止出现除以0的运行时错误。
- 灵活适配:如果你的子数组字段不是
children,直接替换代码中对应的字段名即可。
内容的提问来源于stack exchange,提问作者Прохор ДжаваСкриптонит
相关产品推荐
相关产品推荐

