首页 > 解决方案 > 根据条件合并单个数组中的顺序对象

问题描述

我想根据条件将数据的顺序对象合并到一个数组中。我有一个行程数组,其中每个对象都是该行程的一段。考虑以下示例:

行程一:WALK - WALK - WALK - VEHICLE - WALK - VEHICLE - WALK ^ short transfer

行程二:WALK - WALK - WALK - VEHICLE - WALK - WALK - VEHICLE - WALK - VEHICLE

行程 3:WALK - WALK - VEHICLE - WALK - WALK


我想做的是将WALK腿合并(如果它们是连续的(彼此紧随其后)成一条WALK腿覆盖合并的部分,见下文:

行程一:WALK - VEHICLE - WALK - VEHICLE - WALK ^ short transfer

行程二:WALK - VEHICLE - WALK - VEHICLE - WALK - VEHICLE

行程 3:WALK - VEHICLE - WALK


每个腿对象看起来像这样:

{
    mode: 'WALK', // or VEHICLE
    to: { ... },
    from: { ... }
}

我尝试使用.reduce()并在其当前索引功能的帮助下将不同部分组合在一起,但没有成功。我什至不知道它是否是正确使用的功能。

const oldTrip = [
	{ mode: 'WALK' },
	{ mode: 'WALK' },
	{ mode: 'VEHICLE' },
	{ mode: 'VEHICLE' },
	{ mode: 'WALK' }
];

let previousWalk = false;
const newTrip = oldTrip.reduce((acc, cur, idx) => {
  if (cur.mode === 'VEHICLE') previousWalk = false;
  else {
    if (previousWalk) {
      
    }
    previousWalk = true;
  }
  return acc;
});

非常感谢任何帮助或朝着正确的方向推动!

标签: javascriptarraysobjectreduce

解决方案


我使用带有索引的 filter() 而不是 reduce(),幸好我们不能像这样遇到 OutOfBound。当我们有一个“WALK”作为当前元素时,我们只检查重复。我添加了第四个示例来显示非步行重复不会被过滤。

function filterRepWalk(a) {
  return a.filter((v,i) => v != "WALK" || v != a[i-1]);
}

console.log(filterRepWalk(["WALK", "WALK", "WALK", "VEHICLE", "WALK",  "VEHICLE", "WALK"]));
console.log(filterRepWalk(["WALK", "WALK", "WALK", "VEHICLE", "WALK", "WALK", "VEHICLE", "WALK", "VEHICLE"]));
console.log(filterRepWalk(["WALK", "WALK", "VEHICLE", "WALK", "WALK"]));
console.log(filterRepWalk(["WALK", "WALK", "WALK", "VEHICLE", "WALK", "WALK", "VEHICLE", "WALK", "VEHICLE", "VEHICLE"]));

为了在对象上做同样的事情,以下工作:

function filterRepWalk(a) {
  return a.filter((v,i) => (!a[i-1] || (v.mode != a[i-1].mode)) || v.mode != "WALK");
}

推荐阅读