我有下一個資料:
const data = [
{amount: 100, percent: 1, days: 7},
{amount: 75, percent: 3, days: 8},
{amount: 75, percent: 3, days: 3},
{amount: 100, percent: 2, days: 5},
{amount: 100, percent: 1, days: 10},
{amount: 50, percent: 3, days: 9}
];
任務是按數量和百分比對物件進行分組,以便如果不同物件中的數量和百分比相同,我需要添加它們的天數。結果應該如下所示:
const data = [
{amount: 100, percent: 1, days: 17},
{amount: 75, percent: 3, days: 11},
{amount: 100, percent: 2, days: 5},
{amount: 50, percent: 3, days: 9}
];
由于百分比不同,第 1 個和第 3 個物件未分組。我曾嘗試使用 reduce 方法:
const result = data.reduce((groupedByAmount, current) => {
let amount = current.amount;
let percent= current.percent;
if (amount == amount && percent == percent) {
groupedByAmount.amount = amount;
current.days = current.days
}
return groupedByAmount
}, {
amount: 0,
percent: null,
days: 0
});
我不知道如何檢查金額和百分比是否相同,也許地圖或過濾器會有所幫助
uj5u.com熱心網友回復:
考慮到您建議的每種方法:
reduce=> 將陣列元素減少為單個值。可用于創建一個物件,然后將該物件轉換回陣列map=> 為陣列中的每個值回傳一個值filter=> 回傳多個(或單個)匹配值
您可以遍歷每個值,構建一個新陣列并使用它filter()來查找要添加的現有值。
注意:由于多次使用.filter()- 使用復合鍵(將兩個值組合成一個值)可??能會更好地執行,這可能不會在大型陣列中表現良好。
const data = [
{amount: 100, percent: 1, days: 7},
{amount: 75, percent: 3, days: 8},
{amount: 75, percent: 3, days: 3},
{amount: 100, percent: 2, days: 5},
{amount: 100, percent: 1, days: 10},
{amount: 50, percent: 3, days: 9}
];
var result = [];
data.forEach(e => {
var current = result.filter(d => d.amount == e.amount && d.percent == e.percent);
if (current.length === 0) {
result.push(e);
} else {
current[0].days = e.days;
}
});
console.log(result);
uj5u.com熱心網友回復:
const data = [
{amount: 100, percent: 1, days: 7},
{amount: 75, percent: 3, days: 8},
{amount: 75, percent: 3, days: 3},
{amount: 100, percent: 2, days: 5},
{amount: 100, percent: 1, days: 10},
{amount: 50, percent: 3, days: 9}
];
const doGroup = (data) => {
const obj = data.reduce((result, next) => {
const key = `${next.amount}_${next.percent}`
const dd = result[key]?.days ?? 0;
result[key] = {...next, days: next.days dd};
return result;
}, {});
return Object.values(obj);
}
console.log(doGroup(data))
uj5u.com熱心網友回復:
const data = [
{amount: 100, percent: 1, days: 7},
{amount: 75, percent: 3, days: 8},
{amount: 75, percent: 3, days: 3},
{amount: 100, percent: 2, days: 5},
{amount: 100, percent: 1, days: 10},
{amount: 50, percent: 3, days: 9}
];
const temp = data.reduce((acc, {amount, percent, days}) => {
acc[amount] ||= {}
acc[amount][percent] ||= 0
acc[amount][percent] = days
return acc;
}
,{});
const result = Object.entries(temp).reduce((acc, [amount, obj]) => {
acc.push(...Object.entries(obj).map(([percent, days]) => ({ amount: Number(amount), percent: Number(percent), days })))
return acc
},[])
console.log(result)
uj5u.com熱心網友回復:
這個例子的行數更多,但也許更簡單。
const data = [
{amount: 100, percent: 1, days: 7},
{amount: 75, percent: 3, days: 8},
{amount: 75, percent: 3, days: 3},
{amount: 100, percent: 2, days: 5},
{amount: 100, percent: 1, days: 10},
{amount: 50, percent: 3, days: 9}
];
function group_by_amount_percent(array) {
var ret = []
var cache = {}
array.forEach(function(e, i, a) {
if (cache[e.amount] == null) { cache[e.amount] = {} }
if (cache[e.amount][e.percent] == null) { cache[e.amount][e.percent] = 0 }
cache[e.amount][e.percent] = e.days
})
for (var amount in cache) {
for (var percent in cache[amount]) {
ret.push({amount: amount, percent: percent, days: cache[amount][percent]})
}
}
return ret
}
console.log('group_by_amount_percent(data): ', group_by_amount_percent(data))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/403799.html
標籤:
