2 回答

TA貢獻1909條經驗 獲得超7個贊
有時,與其試圖在一次操作中完成所有事情,不如一步一步地做事情更有意義。例如,您的問題可以分為兩個步驟。
按國家分組
離散組求和
現在我們所要做的就是創建一些構建塊來幫助您實現這一結果。
通過...分組
按運算符分組很簡單,您已經在這樣做了。但我們可以通過使用地圖使其更快一些。這使我們能夠立即判斷一個國家/地區組是否存在,而無需搜索我們的數組。
const groupBy = (array, selector) => {
? return array.reduce((groups, value) => {
? ? const key = selector(value);
? ? const group = groups.get(key);
? ??
? ? if (group == null) {
? ? ? ? groups.set(key, [value]);
? ? } else {
? ? ? ? group.push(value);
? ? }
? ??
? ? return groups;
? }, new Map());
};
const groups = groupBy(data, (d) => d["Country"]);
我們在這里使用array.reducereduce
將集合轉換為單個值。
和
接下來,我們將使用求和運算符來遍歷每個組并對選擇器返回的內容求和。
const sum = (array, selector) => {
? return array.reduce((s, value) => {
? ? return s + selector(value);
? }, 0);
};
這看起來應該與 非常相似groupBy。我們將reducing多個值合并為一個總和。
結果
現在,既然我們有了兩個構建塊,我們只需將它們單擊在一起即可獲得我們想要的結果。
const groups = groupBy(data, (v) => v["Country"])
const unitsSoldByCountry = Array.from(groups.entries())
? .map(([country, sales]) => {
? ? return {
? ? ? "Country": country,
? ? ? "Units Sold": sum(sales, (s) => s["Units Sold"])
? ? };
? });
我們groupBy
國家。然后,對于每個群體(國家),我們都會sum
增加他們的銷售單位。我們在這里使用array.map運算符,因為我們希望如果有N
國家/地區,我們將返回N
求和記錄。
const data = [
? {
? ? "Country": "USA",
? ? "Units Sold": 1245.56
? },
? {
? ? "Country": "Spain",
? ? "Units Sold": 7843.50
? },
? {
? ? "Country": "USA",
? ? "Units Sold": 1435.99
? },
? {
? ? "Country": "Uruguay",
? ? "Units Sold": 594.20
? }
];
const groupBy = (array, selector) => {
? return array.reduce((groups, value) => {
? ? const key = selector(value);
? ? const group = groups.get(key);
? ??
? ? if (group == null) {
? ? ? ? groups.set(key, [value]);
? ? } else {
? ? ? ? group.push(value);
? ? }
? ??
? ? return groups;
? }, new Map());
};
const sum = (array, selector) => {
? return array.reduce((s, value) => {
? ? return s + selector(value);
? }, 0);
};
const groups = groupBy(data, (v) => v['Country'])
const unitsSoldByCountry = Array.from(groups.entries())
? .map(([country, sales]) => {
? ? return {
? ? ? "Country": country,
? ? ? "Units Sold": sum(sales, (s) => s["Units Sold"])
? ? };
? });
console.log(unitsSoldByCountry);
肯定有一些方法可以用更少的代碼行來做到這一點。但我更喜歡可重用的組件,它們允許更多的聲明性編程,使您的代碼更易于閱讀和更改。

TA貢獻2016條經驗 獲得超9個贊
const data = [
{
"Country" : "USA",
"sold" : 15.56
},
{
"Country" : "USA",
"sold" : 1245.56
},
{
"Country" : "Spain",
"sold" : 7843.50
},
{
"Country" : "USA",
"sold" : 1435.99
},
{
"Country" : "Uruguay",
"sold" : 594.20
},
]
const usaEntries= data.filter(item => item.Country === 'USA')
const sum = pays.reduce((a, n) => (a + Number(n.sold)), 0);
第一行檢索所有美國條目,第二行對所有商品的銷售總額進行求和,它有兩個參數,a 表示累加器,n 表示當前值,0 是將累加器初始化為零。
您也可以在一行中完成
const sum = data.filter(item => item.Country === 'USA').reduce((a, n) => (a + Number(n.sold)), 0);
您還可以將所有國家/地區分組到一個數組中
let group = data.reduce((a, n) => {
a[n.Country] = [...a[n.Country] || [], n];
return a;
}, {});
然后,您可以使用reduce對每個項目應用求和函數,以獲得每個國家/地區的銷售情況。
添加回答
舉報