使用 JavaScript 连接数组中的连续(相关)对象

Concatenate consecutive (related) objects in array using JavaScript

给定以下数组:

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/whilefindIndex()slice()reduce() 的组合来填充新数组.感觉代码比较繁琐,操作比较多

我想知道是否有一种简单的方法(我没有看到)来解决这个问题...欢迎提出任何建议!

使用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);

我相信其中一位大师会进一步完善这一点。但是使用集合来整理是这里的诀窍。 注意:如果你想对这些值求和,只需删除我的数组 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);