JavaScript:多过滤器链与复杂条件

JavaScript:多过滤器链与复杂条件,javascript,arrays,typescript,filter,Javascript,Arrays,Typescript,Filter,通常,您需要过滤具有多个条件的数组: return results .filter(x => controlGroup[x] !== undefined) .filter(x => x.size > 10) 或者,您也可以对复杂条件和单个过滤器执行相同操作: return results .filter(x => controlGroup[x] !== undefined && x.size > 10) // or .filter(

通常,您需要过滤具有多个条件的数组:

return results
  .filter(x => controlGroup[x] !== undefined)
  .filter(x => x.size > 10)
或者,您也可以对复杂条件和单个
过滤器执行相同操作:

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
  )

根据评论,对于一个数组中约40个项目的特殊情况,没有显著的性能改进

从技术上讲,在最坏的情况下,每增加一次迭代都会使时间复杂度增加n倍,因此,如果进行2次迭代,则可能需要两倍的时间,但我们讨论的是纳米级的时间跨度,例如,在这种特殊情况下,
10ns
vs
20ns
。这可能值得考虑,具体取决于数据集的大小、运行代码的机器等


在计算
O
符号时,通常忽略常量。即
O(n)
vs
O(2n)

~Felix Kling(摘自评论)


也就是说,性能是不存在问题的,现在只剩下可读性因素,这是非常主观和基于意见的。这样的质量保证是不允许的。要想得到答案,任何想知道的人都应该和他们的团队讨论这个问题,或者用心决定。一般来说,对于一个等价的代码来说,可读性往往比不上更重要,如上所述。然而,任何人认为更好的可读性取决于个人偏好或团队/公司指导方针。

我看到你讨厌这个问题,而且对“基于意见”的投票非常接近。这是否意味着对性能没有任何影响?在这种情况下,我也会接受否定的答案。当计算
O
符号时,常量通常被忽略。也就是说,
O(n)
O(2n)
被认为是等效的。它是否具有可观察的影响取决于数据的大小、代码运行的机器等。然而,我认为您看不出40项有什么不同。但有一种简单的方法可以找到答案:测量代码的执行时间。@FelixKling谢谢,这让一切都清楚了。我应该自杀。从技术上讲,两个过滤器的时间是一个过滤器的两倍(最坏的情况),但如果它需要20纳秒而不是10纳秒,这并没有什么区别。“可读性或性能”的答案始终是可读性,除非您特别对性能有问题,并且不可读的版本会产生可测量的差异。另请参见投票结束并不意味着选民讨厌这个问题,只是他们认为这个问题不在发布指南的范围之内。一般的回答肯定是主观的,可读性是否总是胜过性能?谁的“可读性”版本获胜?类似地,对于一个特定的情况:什么定义了更多或更少的可读性与更多或更少的性能,特别是考虑到不同的实现根据代码结构具有不同的性能特征(也称为“可读性”)。
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 }))