You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为无限深度数组对象计算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);

关键说明

  1. 分层计算:每一层只计算当前层级所有元素的defaultWeight总和,确保百分比是基于当前层级的占比,而非全局总和。
  2. 纯函数设计:使用扩展运算符复制原对象,不会修改原始数据,避免副作用。
  3. 边界处理:加入了总和为0的判断,防止出现除以0的运行时错误。
  4. 灵活适配:如果你的子数组字段不是children,直接替换代码中对应的字段名即可。

内容的提问来源于stack exchange,提问作者Прохор ДжаваСкриптонит

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:08:12