[英]JavaScript: multiple filters chain vs. complex condition
很多時候,您需要過濾具有多個條件的數組:
return results
.filter(x => controlGroup[x] !== undefined)
.filter(x => x.size > 10)
或者您可以對復雜條件和單個filter
執行相同操作:
return results
.filter(x => controlGroup[x] !== undefined && x.size > 10)
// or
.filter(x =>
controlGroup[x] !== undefined // <- Prettier would place && here. What a joke. 101
&& x.size > 10
)
我的猜測是,由於第二種方法不會多次迭代數組,因此它具有更好的性能特征,
另一方面,第一個在可讀性方面獲勝,並且可以使用簡潔的 git diff LOC 輕松擴展。
在我的特殊情況下,我在 Node.js 服務器上有一個 function ,每個請求在一組 ~40 個項目上運行 3 次(在flat()
之后) 。 已經有很多迭代和一些 lambda 函數,所以我什至懷疑對這兩個過濾器進行微優化會有所作為。 我相信這一切都可以用一個reduce
來重寫以節省 7 次迭代(如果我計算正確的話),但代價是什么?
PS:我正在尋找一個一般性的答案,但你可以回答我的特殊情況作為獎勵。 謝謝你。
export const getProductFeatures =
(technicalSpecifications: TechnicalSpecifications, featuresBySpecLabel: FeaturesBySpecLabel): ProductFeature[] =>
[...technicalSpecifications
.map(specGroup => specGroup.specifications)
.flat()
.filter(spec => featuresBySpecLabel[spec.label] !== undefined)
.filter(spec => verifyFeature(spec, featuresBySpecLabel[spec.label]))
.reduce((productFeatures, spec) => {
productFeatures.add(featuresBySpecLabel[spec.label].featureLabel)
return productFeatures
}, new Set<string>())]
.map(label => ({ label }))
根據評論,對於數組中約 40 個項目的特定情況,性能沒有顯着提升。
從技術上講,在最壞的情況下,每次額外的迭代都會增加 n 倍的時間復雜度,因此使用 2 次迭代O(2n)
,它可能需要兩倍的時間,但我們談論的是納米級的時間跨度,例如。 在這種特殊情況下為10ns
與20ns
。 根據數據集的大小、運行代碼的機器等,可能值得考慮。
計算
O
表示法時通常會忽略常量。 即O(n)
與O(2n)
。
~ Felix Kling (取自評論)
話雖如此,性能可以排除在外,現在只剩下可讀性因素,這是非常主觀和基於意見的。 SO 上不允許此類 QA。 為了得到這個問題的答案,任何想知道的人都應該與他們的團隊討論這個問題或用心決定。 不過,一般而言,對於等效代碼,可讀性往往更受重視,如上所示。 但是,任何人認為更好的可讀性取決於個人喜好或團隊/公司指南。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.