使用JavaScript连接数组中的连续(相关)对象
给定以下数组:使用JavaScript连接数组中的连续(相关)对象,javascript,arrays,ecmascript-6,grouping,object-literal,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 } ]; 合并的最佳方法是什么 类型为“car”且保留元素顺序的连续对象?在本例中,预期结果为: const activities = [ { type: 'car',
const activities = [
{ type: 'car', duration: 60 },
{ type: 'car', duration: 140 },
{ type: 'ferry', duration: 60 },
{ type: 'car', duration: 100 }
];
合并的最佳方法是什么
类型为“car”且保留元素顺序的连续对象?在本例中,预期结果为:
const activities = [
{ type: 'car', duration: 200 }, // merged
{ type: 'ferry', duration: 60 },
{ type: 'car', duration: 100 } // this stays
];
阵列是动态构建的,为了清晰起见,对示例进行了简化
经过多次尝试后,我成功地编写了工作代码,使用了do/while
、findIndex()
、slice()
和reduce()
组合来填充新数组。不过,代码感觉很麻烦,而且涉及很多操作
我想知道是否有一个简单的方法(我没有看到)来解决这个问题。。。欢迎提出任何建议 用于迭代对象。如果累加器中的最后一个项目的类型与当前项目的类型相同(o
),请将持续时间添加到最后一个项目。如果没有,则将当前对象添加到累加器
const活动=[
{类型:'car',持续时间:60},
{类型:'car',持续时间:140},
{类型:'ferry',持续时间:60},
{类型:'car',持续时间:100}
];
常量结果=活动。减少((r,o)=>{
const last=r[r.长度-1];
如果(last&&last.type==o.type)last.duration+=o.duration;
else r.push({…o});
返回r;
}, []);
控制台日志(结果)代码>用于迭代对象。如果累加器中的最后一个项目的类型与当前项目的类型相同(o
),请将持续时间添加到最后一个项目。如果没有,则将当前对象添加到累加器
const活动=[
{类型:'car',持续时间:60},
{类型:'car',持续时间:140},
{类型:'ferry',持续时间:60},
{类型:'car',持续时间:100}
];
常量结果=活动。减少((r,o)=>{
const last=r[r.长度-1];
如果(last&&last.type==o.type)last.duration+=o.duration;
else r.push({…o});
返回r;
}, []);
控制台日志(结果)代码>我相信其中一位大师会进一步完善这一点。但这里的诀窍是使用集合进行整理。
注意:如果要求和这些值,只需删除我的array init并使用+=
const活动=[
{类型:'car',持续时间:60},
{类型:'car',持续时间:140},
{类型:'ferry',持续时间:60},
{类型:'car',持续时间:100}
];
var newSet=newSet();
activities.forEach(activity=>{
if(newSet.has(activity.type)==false){
newSet.add(activity.type);
新闻集[活动.类型]=[];
}
新闻集[activity.type].push(activity.duration);
});
控制台日志(新闻集)代码>我相信其中一位大师会进一步完善这一点。但这里的诀窍是使用集合进行整理。
注意:如果要求和这些值,只需删除我的array init并使用+=
const活动=[
{类型:'car',持续时间:60},
{类型:'car',持续时间:140},
{类型:'ferry',持续时间:60},
{类型:'car',持续时间:100}
];
var newSet=newSet();
activities.forEach(activity=>{
if(newSet.has(activity.type)==false){
newSet.add(activity.type);
新闻集[活动.类型]=[];
}
新闻集[activity.type].push(activity.duration);
});
控制台日志(新闻集)代码>请添加代码…这不是上述问题的重复。它更复杂,因为只有连续的对象应该合并…请添加代码…这不是上述问题的重复。它更复杂,因为只有连续的对象应该合并。。。