簡體   English   中英

JavaScript:多個過濾器鏈與復雜條件

[英]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) ,它可能需要兩倍的時間,但我們談論的是納米級的時間跨度,例如。 在這種特殊情況下為10ns20ns 根據數據集的大小、運行代碼的機器等,可能值得考慮。

計算O表示法時通常會忽略常量。 O(n)O(2n)
~ Felix Kling (取自評論)

話雖如此,性能可以排除在外,現在只剩下可讀性因素,這是非常主觀和基於意見的 SO 上不允許此類 QA。 為了得到這個問題的答案,任何想知道的人都應該與他們的團隊討論這個問題或用心決定。 不過,一般而言,對於等效代碼,可讀性往往更受重視,如上所示。 但是,任何人認為更好的可讀性取決於個人喜好或團隊/公司指南。

暫無
暫無

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

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