我遇到了一個問題:我試圖計算每天每個鍵的總和。但是,我無法得到想要的結果。也許您可以幫助修復錯誤?
這是我解決問題的方法:
const result = input.reduce((acc, curr) => {
const node = acc.find((i) => i.date === curr.date);
if (node) {
return [...acc.filter((i) => i.date !== curr.date), { ...node, date: curr.date, [curr.source]: [curr.source].length 1 }];
}
return [...acc, { date: curr.date, [curr.source]: [curr.source].length }];
}, []);
const input = [
{
date: "01-01-2021",
source: "TT",
},
{
date: "01-01-2021",
source: "TT",
},
{
date: "02-01-2021",
source: "FB",
},
{
date: "02-01-2021",
source: "TT",
},
];
**預期結果: **
const output = [
{
date: "01-01-2021",
TT: 2,
},
{
date: "02-01-2021",
TT: 1,
FB: 1,
},
];
這就是我現在得到的:
const result = [
{
date: "01-01-2021",
TT: 2,
},
{
date: "02-01-2021",
TT: 2,
FB: 1,
},
];
uj5u.com熱心網友回復:
您的代碼問題在于您的 if 陳述句中的以下部分:
[curr.source].length 1
在這里,您將創建一個包含curr.source(1 個元素)的陣列,獲取其始終為 的長度1,然后添加1到其中,得到 2。相反,您可以將此行更改為:
(node[curr.source] ?? 0) 1
這將從您找到的節點中獲取源的值,并將其添加到當前值。如果尚未在節點上設定該值,它將默認為0using ?? 0(這里??是Nullish 合并運算子-||如果您需要更好的瀏覽器支持,可以將其替換為)。node如果在使用.find()using時找不到它,我還建議將您的值默認為空物件?? {},這將允許您洗掉內部 if 陳述句并每次運行該部分代碼:
const input = [ { date: "01-01-2021", source: "TT", }, { date: "01-01-2021", source: "TT", }, { date: "02-01-2021", source: "FB", }, { date: "02-01-2021", source: "TT", }, ];
const result = input.reduce((acc, curr) => {
const node = acc.find((i) => i.date === curr.date) ?? {};
return [...acc.filter((i) => i.date !== curr.date), { ...node, date: curr.date, [curr.source]: (node[curr.source] ?? 0) 1 }];
}, []);
console.log(result);
另一個更有效的選擇是構建一個Map /object ,該物件由您date的物件的鍵鍵控。對于 reduce 方法的每次迭代,您可以從 Map 獲取當前日期的當前累積物件,并根據當前源更新源計數。然后,您可以使用Array.from()該 Map 的.values()迭代器將 Map 轉換為累積物件的陣列:
const input = [ { date: "01-01-2021", source: "TT", }, { date: "01-01-2021", source: "TT", }, { date: "02-01-2021", source: "FB", }, { date: "02-01-2021", source: "TT", }, ];
const res = Array.from(input.reduce((acc, {date, source}) => {
const seen = acc.get(date) ?? {};
return acc.set(date, {...seen, date, [source]: (seen[source] ?? 0) 1});
}, new Map).values());
console.log(res);
uj5u.com熱心網友回復:
您可以對一個物件進行分組并增加給定的源屬性。
const input = [
{ date: "01-01-2021", source: "TT" },
{ date: "01-01-2021", source: "TT" },
{ date: "02-01-2021", source: "FB" },
{ date: "02-01-2021", source: "TT" }
];
const result = Object.values(input.reduce((r, { date, source }) => {
r[date] ??= { date };
r[date][source] = (r[date][source] || 0) 1;
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/402021.html
標籤:javascript 数组
