簡體   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