簡體   English   中英

過濾謂詞在遇到數字后過濾所有項目

[英]Filter predicate that filters all items after it's encountered a number

下面我有一個數組過濾謂詞,它將在遇到數字時刪除所有項目,包括數字。 我擔心這個謂詞的性能,因為它運行整個過濾器的次數超過了它需要的次數(請原諒我不知道 bigO)。 這是因為如果我想要全局 state 在遇到謂詞中的數字時,我必須訪問第三個參數,即整個數組。

還有另一種方法可以做到這一點,並且在謂詞 scope 之外仍然有一個沒有變量的謂詞?

const filterNumberOrAfter = (_: any, index: number, array: any[]): boolean => {
  let encounterdNumber = false
  const total = array.filter((path) => {
    if (encounterdNumber) return false
    if (typeof path === 'number') {
      encounterdNumber = true
      return false
    }
    return true
  })
  return Boolean(total[index])
}

console.log(['hello', 'world', 'meow', 2, 'example', 'rest'].filter(filterNumberOrAfter))
// [ "hello", "world", "meow" ]

一種優化方法是將謂詞封裝在 function 中,並將過濾器的初始運行緩存在父 scope 中,這樣過濾器的每次迭代都可以訪問僅運行一次的原始過濾數組。

const filterNumberOrAfter = () => {
  let total: string[] = []
  return (_: any, index: number, array: any[]): boolean => {
    if (index === 0) {
      let encounterdNumber = false
      total = array.filter((path) => {
        if (encounterdNumber) return false
        if (typeof path === 'number') {
          encounterdNumber = true
          return false
        }
        return true
      })
    }
    return Boolean(total[index])
  }
}

console.log(['hello', 'world', 'meow', 2, 'example', 'rest'].filter(filterNumberOrAfter()))

評論者認為,這是一個很好的單行線,更容易閱讀。

const getItemsTillNumber = (arr: any[]) => {
  return arr.slice(0, arr.findIndex((item) => typeof item === 'number') || arr.length)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM