亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

合并具有相似鍵值的對象數組并創建包含較少對象的新數組

合并具有相似鍵值的對象數組并創建包含較少對象的新數組

拉莫斯之舞 2023-08-24 10:21:29
我有一個對象數組(超過 5000 個條目),其中包含Units Sold來自多個國家/地區的數據。我試圖獲取所有類似的國家/地區,添加金額,然后返回一個新的對象數組,其中每個國家/地區及其總金額僅出現一次。我認為下面的代碼是正確的,但我確信我正在采取低效的路線,并且肯定它是完全錯誤的。我確定我需要應用該reduce()方法,并且可能還需要使用其他方法forEach(),但我不確定如何使用。已經這樣做了幾天了,并且希望/感謝一些幫助。謝謝!  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     },    ]    let result = [];    data.forEach((block) => {      if (result.length === 0) {        result.push({          Country: block.Country,          "Units Sold": block["Units Sold"],        });      } else {        data.forEach((e) => {          if (e.Country === block.Country) {            console.log("add values");            e["Units Sold"] += block["Units Sold"];            console.log(e);          }        });      }    });期望的結果:    const newArray = [     {      "Country" : "USA",      "Units Sold" : 2681.55     },     {      "Country" : "Spain",      "Units Sold" : 7843.50     },     {      "Country" : "Uruguay",      "Units Sold" : 594.20     },    ]
查看完整描述

2 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

有時,與其試圖在一次操作中完成所有事情,不如一步一步地做事情更有意義。例如,您的問題可以分為兩個步驟。

  1. 按國家分組

  2. 離散組求和

現在我們所要做的就是創建一些構建塊來幫助您實現這一結果。

通過...分組

按運算符分組很簡單,您已經在這樣做了。但我們可以通過使用地圖使其更快一些。這使我們能夠立即判斷一個國家/地區組是否存在,而無需搜索我們的數組。

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);


肯定有一些方法可以用更少的代碼行來做到這一點。但我更喜歡可重用的組件,它們允許更多的聲明性編程,使您的代碼更易于閱讀和更改。



查看完整回答
反對 回復 2023-08-24
?
慕沐林林

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對每個項目應用求和函數,以獲得每個國家/地區的銷售情況。


查看完整回答
反對 回復 2023-08-24
  • 2 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號