2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
有時(shí),與其試圖在一次操作中完成所有事情,不如一步一步地做事情更有意義。例如,您的問題可以分為兩個(gè)步驟。
按國家分組
離散組求和
現(xiàn)在我們所要做的就是創(chuàng)建一些構(gòu)建塊來幫助您實(shí)現(xiàn)這一結(jié)果。
通過...分組
按運(yùn)算符分組很簡單,您已經(jīng)在這樣做了。但我們可以通過使用地圖使其更快一些。這使我們能夠立即判斷一個(gè)國家/地區(qū)組是否存在,而無需搜索我們的數(shù)組。
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"]);
我們?cè)谶@里使用array.reducereduce
將集合轉(zhuǎn)換為單個(gè)值。
和
接下來,我們將使用求和運(yùn)算符來遍歷每個(gè)組并對(duì)選擇器返回的內(nèi)容求和。
const sum = (array, selector) => {
? return array.reduce((s, value) => {
? ? return s + selector(value);
? }, 0);
};
這看起來應(yīng)該與 非常相似groupBy。我們將reducing多個(gè)值合并為一個(gè)總和。
結(jié)果
現(xiàn)在,既然我們有了兩個(gè)構(gòu)建塊,我們只需將它們單擊在一起即可獲得我們想要的結(jié)果。
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
國家。然后,對(duì)于每個(gè)群體(國家),我們都會(huì)sum
增加他們的銷售單位。我們?cè)谶@里使用array.map運(yùn)算符,因?yàn)槲覀兿M绻?code>N國家/地區(qū),我們將返回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);
肯定有一些方法可以用更少的代碼行來做到這一點(diǎn)。但我更喜歡可重用的組件,它們?cè)试S更多的聲明性編程,使您的代碼更易于閱讀和更改。

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
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);
第一行檢索所有美國條目,第二行對(duì)所有商品的銷售總額進(jìn)行求和,它有兩個(gè)參數(shù),a 表示累加器,n 表示當(dāng)前值,0 是將累加器初始化為零。
您也可以在一行中完成
const sum = data.filter(item => item.Country === 'USA').reduce((a, n) => (a + Number(n.sold)), 0);
您還可以將所有國家/地區(qū)分組到一個(gè)數(shù)組中
let group = data.reduce((a, n) => {
a[n.Country] = [...a[n.Country] || [], n];
return a;
}, {});
然后,您可以使用reduce對(duì)每個(gè)項(xiàng)目應(yīng)用求和函數(shù),以獲得每個(gè)國家/地區(qū)的銷售情況。
添加回答
舉報(bào)