[
{ 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 。这必须是动态的
请看看
答案 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);