簡體   English   中英

如何按特定對象鍵對數組中的值求和?

[英]How to sum values in array by specific object key?

我有一個 js 對象數組,如下所示:

var objArr = [
     {"Country": "US", "City": "MyCity1", "2017-07-12": "1", "2017-07-13": "2"},
     {"Country": "US", "City": "MyCity2", "2017-07-12": "2", "2017-07-13": "2"},
     {"Country": "CN", "City": "MyCity1", "2017-07-12": "5", "2017-07-13": "7"},
     {"Country": "CN", "City": "MyCity2", "2017-07-12": "5", "2017-07-13": "7"}
   ]

我想創建一個新數組,其中國家/地區是唯一的,但日期也應該相加。

{"Country": "US", "2017-07-12":  "3", "2017-07-13": "4"},
{"Country": "CN", "2017-07-12": "10", "2017-07-13": "14"}
            ^^^^                ^^^^                ^^^^   

我很難理解它。 我是否必須先過濾,以某種方式減少它,重新映射它,......我不知道從哪里開始? 任何幫助將不勝感激,謝謝!

使用Array.reduce ,檢查當前國家的對象是否存在,如果存在,循環遍歷Object.keys更新值,如果不存在,推送一個新的:

編輯:如果你不想要 City 你可以解構它{City, ...curr}

 var objArr = [ { Country: "US", City: "MyCity1", "2017-07-12": "1", "2017-07-13": "2" }, { Country: "US", City: "MyCity2", "2017-07-12": "2", "2017-07-13": "2" }, { Country: "CN", City: "MyCity1", "2017-07-12": "5", "2017-07-13": "7" }, { Country: "CN", City: "MyCity2", "2017-07-12": "5", "2017-07-13": "7" } ]; var result = objArr.reduce((acc, {City, ...curr}) => { const ndx = acc.findIndex(e => e.Country === curr.Country); if (ndx > -1) { const [country, ...keys] = Object.keys(curr); keys.forEach(k => { acc[ndx][k] = +acc[ndx][k] + +curr[k]; }); } else { acc.push(curr); } return acc; }, []); console.log(result);

您可以使用reduce()創建一個對象來對元素進行分組,然后使用Object.values

 var objArr = [ {"Country": "US", "City": "MyCity1", "2017-07-12": "1", "2017-07-13": "2"}, {"Country": "US", "City": "MyCity2", "2017-07-12": "2", "2017-07-13": "2"}, {"Country": "CN", "City": "MyCity1", "2017-07-12": "5", "2017-07-13": "7"}, {"Country": "CN", "City": "MyCity2", "2017-07-12": "5", "2017-07-13": "7"} ] let keys = ["2017-07-12", "2017-07-13"]; const res = Object.values(objArr.reduce((ac, a) => { if(!ac[a.Country]){ ac[a.Country] = {Country: a.Country}; } keys.forEach(k => { ac[a.Country][k] = (ac[a.Country][k] || 0) + Number(a[k]); }) return ac; }, {})) console.log(res)

對數組使用一個forEach並使用forEach遍歷每個對象的日期鍵,並使用唯一鍵作為Country和累積值構建一個res對象。 使用Object.values of res 從 res 對象獲取數組。

更新:修復以確保日期總是一種類型,即number

 var objArr = [ { Country: "US", City: "MyCity1", "2017-07-12": "1", "2017-07-13": "2" }, { Country: "US", City: "MyCity2", "2017-07-12": "2", "2017-07-13": "2" }, { Country: "CN", City: "MyCity1", "2017-07-12": "5", "2017-07-13": "7" }, { Country: "CN", City: "MyCity2", "2017-07-12": "5", "2017-07-13": "7" } ]; const update = data => { const res = {}; data.forEach(({ Country, City, ...dates }) => { const item = res[Country] || { Country }; Object.keys(dates).forEach(date => { item[date] = (item[date] || 0) + Number(dates[date]); }); res[Country] = { ...item }; }); return Object.values(res); }; console.log(update(objArr));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM