【问题标题】:Group by 2 columns based on parameters and sum up total [duplicate]根据参数按2列分组并汇总总计[重复]
【发布时间】:2021-01-21 16:35:43
【问题描述】:
{ Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5", Status: "Done", Month: "May" },
    { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10", Status: "Started", Month: "May" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15", Status: "Done", Month: "June" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20", Status: "Started", Month: "Aug" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25", Status: "Done", Month: "Apr" },
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30", Status: "NotStarted", Month: "May" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35", Status: "Done", Month: "Oct" },
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40", Status: "NotStarted", Month: "Dec" }

我需要从上面的 JSon 中获取总价值,根据 2 个字段分组。这些字段可以是动态的。例如,该组可以 Phase 和 Step 输出应该是这样的

{ Phase: "Phase 1", Step: "Step 1", Task: "Task 1, Task 2", Value: "15" },
    { Phase: "Phase 1", Step: "Step 2", Task: "Task 1, Task 2", Value: "35" },    
    { Phase: "Phase 2", Step: "Step 1", Task: "Task 1, Task 2", Value: "55" },    
    { Phase: "Phase 2", Step: "Step 2", Task: "Task 1, Task 2", Value: "75" }

或者分组依据可以是阶段和状态

我使用以下代码按阶段和步骤分组。 但我希望按参数分组是动态的并在运行时决定

result = Object.values(
  data.reduce((r, o) => {
    const key = `${o.Phase}_${o.Step}`;
    r[key] = r[key] || { Phase: o.Phase, Step: o.Step, Task: [], Value: 0 };
    r[key].Task.push(o.Task);
    r[key].Value += +o.Value;
    return r;
  }, {})
).map((o) => ({ ...o, Task: o.Task.join(",") }));

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我下面的代码适用于任意数量的键。定义你想要的keys

    不确定是否要连接所有其他字段。

    const data = [{ Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5", Status: "Done", Month: "May" },
        { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10", Status: "Started", Month: "May" },
        { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15", Status: "Done", Month: "June" },
        { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20", Status: "Started", Month: "Aug" },
        { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25", Status: "Done", Month: "Apr" },
        { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30", Status: "NotStarted", Month: "May" },
        { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35", Status: "Done", Month: "Oct" },
        { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40", Status: "NotStarted", Month: "Dec" }];
    
    const keys = ["Phase", "Step"];
    function matches(table, entry, keys) { // finds item with same values
      return table.find(e => keys.every(k => e[k] == entry[k]));
    }
    const result = data.reduce((cur, val) => {
      let alreadyIn = matches(cur, val, keys);
      if (alreadyIn) {
        alreadyIn['Value'] = (parseInt(alreadyIn['Value']) + parseInt(val['Value'])).toString();
      } else {
        cur.push(val);
      }
      return cur;
    }, []);
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多