javascript - 在数组中找到事件 x 和事件 y 的最佳方法是什么?
问题描述
基本上我有这个带有“进入”和“离开”事件的数组,看起来像这样。
[
{ event: 'enter', createdAt: 2021-02-25T17:13:42.221Z },
{ event: 'leave', createdAt: 2021-02-25T18:13:42.221Z },
{ event: 'enter', createdAt: 2021-02-26T10:13:42.221Z },
{ event: 'enter', createdAt: 2021-02-26T10:14:42.221Z },
{ event: 'leave', createdAt: 2021-02-26T12:13:42.221Z },
{ event: 'leave', createdAt: 2021-02-26T12:14:42.221Z }
]
这个想法是获得 1 个进入事件和 1 个离开事件,如果有超过 1 个进入事件,则选择第一个,如果有超过 1 个离开事件,则选择最后一个。
最终目的是拥有一个看起来像这样的数组。
[
{ event: 'enter', createdAt: 2021-02-25T17:13:42.221Z },
{ event: 'leave', createdAt: 2021-02-25T18:13:42.221Z },
{ event: 'enter', createdAt: 2021-02-26T10:13:42.221Z },
{ event: 'leave', createdAt: 2021-02-26T12:14:42.221Z }
]
我解决这个问题的想法是进行布尔检查,告诉我是否找到了输入,如果它是第一个,如果找到了离开,它是最后一个。但我认为应该有更好的方法来解决这个问题,任何想法都值得赞赏。
calculateTime = async (eventsArr) => {
console.log('calculating time')
let enterCheck: Boolean = false;
let leaveCheck: Boolean = false;
let lastLeaveCheck: Boolean = false;
eventsArr.forEach(element => {
if (!enterCheck && element.event === 'enter' ){
enterCheck = true;
console.log('enter found');
} else if(enterCheck && element.event === 'leave') {
leaveCheck = true;
}
});
return true
}
解决方案
不需要布尔标志,您需要做的就是将每个项目与前一个项目进行比较以决定是否保留它。只有当它是与以前不同的事件(新组中的第一个)时,才将其复制到新数组中。
您可以使用以下方法执行此操作filter
:
const arr = [
{ event: 'enter', createdAt: '2021-02-25T17:13:42.221Z' },
{ event: 'leave', createdAt: '2021-02-25T18:13:42.221Z' },
{ event: 'enter', createdAt: '2021-02-26T10:13:42.221Z' },
{ event: 'enter', createdAt: '2021-02-26T10:14:42.221Z' },
{ event: 'leave', createdAt: '2021-02-26T12:13:42.221Z' },
{ event: 'leave', createdAt: '2021-02-26T12:14:42.221Z' },
];
const newArr = arr.filter((obj, i) => i==0 || obj.event != arr[i-1].event);
console.log(newArr);
推荐阅读
- html - 即使通过引导程序设置宽度后控件也无法正确对齐
- prolog - 枚举图中的所有行走
- unity3d - 如何使 Canvas 适应不同的手机分辨率?Unity3d
- powerquery - 如何更改列的内容以根据条件从另一列中选择,当它确实从中选择时将该列留空
- java - 如何对齐在类内部而不是 xml 文件中动态创建的 imageViews
- python - 使用 Pandas 写入文件会创建空行
- wordpress - 获取 WPBakery 的 Post Grid 的日程安排帖子
- node.js - 为什么 ng build 在 Angular 应用程序中不起作用?
- java - 如何通知一个对象另一个对象的事件?爪哇
- angular - @ng-bootstrap、*ngFor 和动态列