Javascript多个分组依据,用于动态字段

时间:2020-05-11 04:26:34

标签: javascript

    [ 
        { Phase: "Phase 1",Value1: "5", Value2: "4" },
        { Phase: "Phase 1",Value1: "3", Value2: "7" },
        { Phase: "Phase 1",Value1: "5", Value2: "2" },
        { Phase: "Phase 1",Value1: "2", Value2: "1" },
        { Phase: "Phase 2",Value1: "1", Value2: "3" },
        { Phase: "Phase 2",Value1: "4", Value2: "8" },
        { Phase: "Phase 2",Value1: "5", Value2: "1" },
        { Phase: "Phase 2",Value1: "1", Value2: "1" }
    ]

嗨,我有一个对象数组,我期望下面的格式。 我想通过将value1和value2的所有数据相加来获得结果(它可以是动态的,也可以是更多的) 按阶段分组。

我正在使用javascript进行编码,但结果不正确。

    [ 
        { Phase: "Phase 1",Value1: "15", Value2: "14" },
        { Phase: "Phase 2",Value1: "11", Value2: "13" }
    ]

我找不到任何方法可以实现这一目标。

    function utils(data, field){
        var data = [{ Phase: "Phase 1", Value1: "5", Value2: "4" }, { Phase: "Phase 1", Value1: "3", Value2: "7" }, { Phase: "Phase 1", Value1: "5", Value2: "2" }, { Phase: "Phase 1", Value1: "2", Value2: "1" }, { Phase: "Phase 2", Value1: "1", Value2: "3" }, { Phase: "Phase 2", Value1: "4", Value2: "8" }, { Phase: "Phase 2", Value1: "5", Value2: "1" }, { Phase: "Phase 2", Value1: "1", Value2: "1" }],
        result = Object.values(data.reduce((r, { Phase, ...o }) => {
            if (!r[Phase]) r[Phase] = { Phase };
            Object.entries(o).forEach(([k, v]) => r[Phase][k] = (r[Phase][k] || 0) + +v);
            return r;
        }, {}));

        return result
    }


    utils(data, "Phase")

我在这里编写了这样的代码。但是,如果我进行更改,则字段应该在此处为动态 字段 阶段正在进入未定义状态,并且不会出现错误的结果。

我想使用我发送的功能中的 field 而不是 Phase 。这必须是动态的

请看看

2 个答案:

答案 0 :(得分:1)

此解决方案可能适合您

var arr = [
  { Phase: "Phase 1", Value1: "5", Value2: "4" },
  { Phase: "Phase 1", Value1: "3", Value2: "7" },
  { Phase: "Phase 1", Value1: "5", Value2: "2" },
  { Phase: "Phase 1", Value1: "2", Value2: "1" },
  { Phase: "Phase 2",  Value1: "1", Value2: "3" },
  { Phase: "Phase 2", Value1: "4", Value2: "8" },
  { Phase: "Phase 2", Value1: "5", Value2: "1" },
  { Phase: "Phase 2", Value1: "1", Value2: "1" }
];

var outPut = arr.reduce((a, b) => {

  //check result array has the phase
  let c = a.find(e => e.Phase == b.Phase);
  
  //if result array has the phase, increase properties values
  if (c) {
    c.Value1 = String(parseInt(c.Value1) + parseInt(b.Value1));
    c.Value2 = String(parseInt(c.Value2) + parseInt(b.Value2));
  } 
  //if not add current object into result array
  else
    a.push(b);

  return a;

}, []);

console.log(outPut);

答案 1 :(得分:0)

您可以使用array#reduce并根据Phase进行累积。

const data = [ { Phase: "Phase 1",Value1: "5", Value2: "4" }, { Phase: "Phase 1",Value1: "3", Value2: "7" }, { Phase: "Phase 1",Value1: "5", Value2: "2" }, { Phase: "Phase 1",Value1: "2", Value2: "1" }, { Phase: "Phase 2",Value1: "1", Value2: "3" }, { Phase: "Phase 2",Value1: "4", Value2: "8" }, { Phase: "Phase 2",Value1: "5", Value2: "1" }, { Phase: "Phase 2",Value1: "1", Value2: "1" } ],
      result = Object.values(data.reduce((r, o) => {
        r[o.Phase] = r[o.Phase] || {Phase: o.Phase, Value1: 0, Value2: 0};
        r[o.Phase].Value1 += +o.Value1;
        r[o.Phase].Value2 += +o.Value2;
        return r;
      },{}));
console.log(result);