我有下一个数据:
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}
];
由于百分比不同,第一个和第三个对象未分组。 我尝试过使用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
});
我不知道如何检查金额和百分比是否相同,也许 map 或过滤器会有所帮助
最佳答案
考虑您建议的每种方法:
reduce
=> 将数组元素减少为单个值。可用于创建对象,然后将该对象转换回数组map
=> 返回数组中每个值的值过滤器
=>返回多个(或单个)匹配值
您可以循环遍历每个值,构建一个新数组并使用 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);
关于javascript - 需要将对象数组中的对象分组为一组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70576867/