繁体   English   中英

在数组中找到事件 x 和事件 y 的最佳方法是什么?

[英]What would be the best way to find an event x and an event y in an array?

基本上我有这个带有“进入”和“离开”事件的数组,看起来像这样。

[
  { 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 }
]

我解决这个问题的想法是让 boolean 检查告诉我是否找到输入,如果它是第一个,如果找到离开,它是最后一个。 但我认为应该有更好的方法来解决这个问题,任何想法都值得赞赏。

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
    }

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

您可以使用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);

你可以保留一个计数器,它随着enter增加而随着leave减少。 如果递增后为 1,或递减后为 0,则应保留记录,否则不:

 let 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' }, ]; let count = 0; let result = arr.filter(({event}, i) => { let add = +(event == "enter"); count += add || -1; return count <= add; }); console.log(result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM