[英]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.