我需要映射并收集陣列中的名稱總和值,但我不知道最好的解決方案是什么,我被卡住了。我得到的資料如下所示:
{
timestamp:"2022-09-15",
management: [
{ id: 1;
name: Sam;
sum: 12;
},
{ id: 2;
name: Sam;
sum: 20;
},
{ id: 3;
name: Sam;
sum: 30;
},
{ id: 4;
name: Sam;
sum: null;
},
{ id: 5;
name: Mae;
sum: 456;
}]
我想要實作的是這個輸出:
this.labels = ["Sam", "Mae"];
this.sums = [ 62, 456];
所以我想找到并添加 Sam 擁有的所有總和值,以及 Mae 擁有的所有值,并將它們收集到一個陣列中。推薦的方法是什么?我試過的:
interface FinancesUI {
timestamp: string;
management: ProductUI[];
}
interface ProductUI {
id: number;
name: string;
sum: number;
}
finances: FinancesUI;
labels = string[];
sums = number[];
ngOnInit() {
this.financesService.getProducts()
.subscribe({
next: (financesUI: FinancesUI) => {
this.finances = financesUI;
const allNames = this.finances.management.map((data) => data.name);
const getSum = this.finances.management.map((data) => data.sum);
this.labels = [...new Set(allNames)];
this.finances.management.forEach((management, i = 0) => {
if (management.name === this.labels[i]) {
this.sums.push(management.sum);
}
})
},
error: (error) => {
...
}
});
}
我收到錯誤“無法讀取未定義的屬性‘推送’”。有人可以幫幫我嗎?
uj5u.com熱心網友回復:
您可以通過減少 https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce來做到這一點
const {labels, sum} = YOUR_OBJECT.management.reduce((acc, curr) => {
const {name, sum} = curr;
const pos = acc.labels.indexOf(name)
if (pos === -1){
acc.labels.push(name)
acc.sums.push(sum)
} else {
acc.sums[pos] = sum
}
return acc}, {labels: [], sums: []})
像這樣的東西應該作業!
uj5u.com熱心網友回復:
this.sums?.push(person.sum);
嘗試在總和后添加 {?}
uj5u.com熱心網友回復:
通常來說,一般來說。groupBy name 然后取每個組的總和。
// like groupBy, but a bit more versatile due to the reducer.
function aggregate(list, getKey, reducer) {
const map = new Map();
for (const item of list) {
const key = getKey(item);
map.set(key, reducer(map.get(key), item));
}
return map;
}
const data = [
{ id: 1, name: "Sam", sum: 12 },
{ id: 2, name: "Sam", sum: 20 },
{ id: 3, name: "Sam", sum: 30 },
{ id: 4, name: "Sam", sum: null },
{ id: 5, name: "Mae", sum: 456 }
];
const sumsByName = aggregate(
data,
item => item.name, //group by Name
(total=0, item) => total ( item.sum) // aggregate some value per group
);
console.log("labels", [...sumsByName.keys()]);
console.log("sums", [...sumsByName.values()]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/508422.html
標籤:javascript 打字稿