如何根据名称对值求和? 我已经尝试过了,但是遇到了麻烦。 我想写的名字不重复``dataGrf''中值的累加和。
我在下面做了一个小例子来说明我要做什么。
Ps:我为我的英语道歉
Ex) data: = [
{ 'id': 1, 'value': 10, 'name': 'Mary' },
{ 'id': 2, 'value': 5, 'name': 'John' },
{ 'id': 3, 'value': 2, 'name': 'Mary' },
{ 'id': 4, 'value': 3, 'name': 'Lauren' },
{ 'id': 5, 'value': 2, 'name': 'Lauren' },
{ 'id': 6, 'value': 6, 'name': 'Mary' },
];
expected result:
dataGrf: [
{ 'name': 'Mary', 'valueAcum': 18 },
{ 'name': 'John', 'valueAcum': 5 },
{ 'name': 'Lauren', 'valueAcum': 5 }
]
我的ChartModel:
export class ChartModel {
constructor(
public name?: string,
public valueAcum?: number
) { }
}
我的功能:
loadData() {
this.loading = true;
this.dataChart.emit(null);
this.dataService.getData(this.year, this.month).
subscribe((data: dataModel[]) => {
let dataSort: dataModel[];
dataSort = data.filter(f => f.value> 0)
dataSort = dataSort.sort((a, b) => a.value> b.value? -1 : 1)
this.dataChart.emit(dataSort);
this.dataGrf = new Array<ChartModel>();
let valueAcum= dataSort.reduce((sum, record) => {
let nameArea = data.map(f => f.name);
nameArea = nameArea.filter(function (item, pos) {
return nameArea.indexOf(item) == pos;
});
if (record.name === nameArea[0]) {
return sum + record.value;
}
return sum;
}, 0);
dataSort.forEach(f => {
this.dataGrf.push(new ChartModel(f.name, valueAcum))
});
this.loading = false;
}
}
答案 0 :(得分:1)
您可以使用reduce
函数创建另一个对象,该对象的键是名称,值是具有name和valueAccum键的对象,可以进行数据转换。然后使用Object.values
将此对象转换为数组:
const data = [
{ 'id': 1, 'value': 10, 'name': 'Mary' },
{ 'id': 2, 'value': 5, 'name': 'John' },
{ 'id': 3, 'value': 2, 'name': 'Mary' },
{ 'id': 4, 'value': 3, 'name': 'Lauren' },
{ 'id': 5, 'value': 2, 'name': 'Lauren' },
{ 'id': 6, 'value': 6, 'name': 'Mary' },
];
const result = Object.values(data.reduce((accum, { name, value }) => {
const accumValue = accum[name] ? accum[name].valueAccum : 0;
accum[name] = { name, valueAccum: value + accumValue };
return accum;
}, {}));
console.log(result)