javascript - 根据条件合并单个数组中的顺序对象
问题描述
我想根据条件将数据的顺序对象合并到一个数组中。我有一个行程数组,其中每个对象都是该行程的一段。考虑以下示例:
行程一: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;
});
非常感谢任何帮助或朝着正确的方向推动!
解决方案
我使用带有索引的 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");
}
推荐阅读
- windows - 如何向使用 sessionhost 的用户发送 RdsUserSessionMessage?
- electron - 从 NAS 运行时,Electron 应用程序变慢
- java - java - 如何在Java的XWPFDocument中添加新行?
- json - 快速不规则 json 解析
- c# - 将 JToken 添加到 JObject 中的特定 JsonPath
- javascript - 订阅后如何获取用户信息?
- angular - 单击按钮在 Angular 中下载文件
- spacy - 将 SpaCy PhraseMatcher 保存到磁盘
- javascript - 如何获取 github html div 元素 gist id
- javascript - 将一串逗号分隔的数字转换为二维数组