给出以下数组:
const activities = [
{ type: 'car', duration: 60 },
{ type: 'car', duration: 140 },
{ type: 'ferry', duration: 60 },
{ type: 'car', duration: 100 }
];
什么是最好的合并方法
type: 'car'
的连续对象,同时保留元素的顺序?在此示例中,期望的结果将是:
const activities = [
{ type: 'car', duration: 200 }, // merged
{ type: 'ferry', duration: 60 },
{ type: 'car', duration: 100 } // this stays
];
该数组是动态构建的,为清楚起见,该示例进行了简化。
经过几次尝试,我设法编写了工作代码,使用do/while
,findIndex()
,slice()
和reduce()
的组合来填充新数组。该代码很麻烦,并且涉及许多操作。
我只是想知道是否有一种简单的方法(我没有看到)来解决这个问题……欢迎提出任何建议!
答案 0 :(得分:1)
使用Array.reduce()
迭代对象。如果累加器中的最后一项与当前项目(o
)具有相同的类型,则将持续时间添加到最后一项。如果没有,则将当前对象添加到累加器中。
const activities = [
{ type: 'car', duration: 60 },
{ type: 'car', duration: 140 },
{ type: 'ferry', duration: 60 },
{ type: 'car', duration: 100 }
];
const result = activities.reduce((r, o) => {
const last = r[r.length - 1];
if(last && last.type === o.type) last.duration += o.duration;
else r.push({ ...o });
return r;
}, []);
console.log(result);
答案 1 :(得分:0)
我相信其中一位大师将进一步完善这一点。但是,在这里使用套头整理是技巧。 注意:如果您想对这些值求和,只需删除我的数组init并使用+ =
const activities = [
{ type: 'car', duration: 60 },
{ type: 'car', duration: 140 },
{ type: 'ferry', duration: 60 },
{ type: 'car', duration: 100 }
];
var newSet = new Set();
activities.forEach(activity => {
if(newSet.has(activity.type) == false) {
newSet.add(activity.type);
newSet[activity.type] = [];
}
newSet[activity.type].push(activity.duration);
});
console.log(newSet);