首页 > 解决方案 > 在数组中找到事件 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
    }

标签: javascriptalgorithmsorting

解决方案


不需要布尔标志,您需要做的就是将每个项目与前一个项目进行比较以决定是否保留它。只有当它是与以前不同的事件(新组中的第一个)时,才将其复制到新数组中。

您可以使用以下方法执行此操作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);


推荐阅读