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

时间:2018-12-25 21:33:50

标签: javascript arrays ecmascript-6 grouping object-literal

给出以下数组:

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()的组合来填充新数组。该代码很麻烦,并且涉及许多操作。

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

2 个答案:

答案 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);