使用 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/while
、findIndex()
、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);
给定以下数组:
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()
的组合来填充新数组.感觉代码比较繁琐,操作比较多
我想知道是否有一种简单的方法(我没有看到)来解决这个问题...欢迎提出任何建议!
使用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);