在Javascript中无自定义函数链接时将数组转换为集合的较短方法

在Javascript中无自定义函数链接时将数组转换为集合的较短方法,javascript,Javascript,考虑这一系列操纵数组并生成一个集合的方法: [...Array(20).keys()] .filter(j => j % 3) .map(j => j * 5) .reduce((j, k) => { j.add(k); return j }, new Set()) ==> Set { 5, 10, 20, 25, 35, 40, 50, 55, 65, 70, 80, 85, 95 } 我知道这可以通过包装链来重写: new Set([...Array(2

考虑这一系列操纵数组并生成一个集合的方法:

[...Array(20).keys()]
  .filter(j => j % 3)
  .map(j => j * 5)
  .reduce((j, k) => { j.add(k); return j }, new Set())
==>
Set { 5, 10, 20, 25, 35, 40, 50, 55, 65, 70, 80, 85, 95 }
我知道这可以通过包装链来重写:

new Set([...Array(20).keys()]
  .filter(j => j % 3)
  .map(j => j * 5))
==>
Set { 5, 10, 20, 25, 35, 40, 50, 55, 65, 70, 80, 85, 95 }
但这打破了链条,迫使读者倒退

有没有办法写出最后一步:

  .reduce((j, k) => { j.add(k); return j }, new Set())
以一种更简单的方式,只使用Javascript内置函数,而不破坏链?

您只需要使用j.addk,它将返回set本身

将值附加到集合对象。返回具有附加值的集合对象

为了减少这些步骤,您可以一次完成所有这些步骤,过滤器和映射可以用reduce替换,在您的案例中,2个reduce可以组合成一个

[...Array(20).keys()]
  .reduce((j, k) => (k % 3 ? j.add(k * 5) : j), new Set())
您只需要使用j.addk,它将返回集合本身

将值附加到集合对象。返回具有附加值的集合对象

为了减少这些步骤,您可以一次完成所有这些步骤,过滤器和映射可以用reduce替换,在您的案例中,2个reduce可以组合成一个

[...Array(20).keys()]
  .reduce((j, k) => (k % 3 ? j.add(k * 5) : j), new Set())

当您可以在reduce中完成所有操作时,为什么需要过滤器和映射?@charlietfl Readability用于非玩具箱。如果可能的话,我正在寻找一种避免长时间减少的方法。这里有Array.from,我想我正在寻找Array.into,这样我就可以做[].filterj=>j%3.mapj=>j*5.intonew Set或类似的事情。与Java的where you can.collectCollectors.toSetOk类似,但仅仅因为该链看起来很酷,您就创建了两个额外的新数组,并进行了比实际更多的迭代necessary@charlietfl关于性能的观点。我倾向于选择非关键代码的可读性。当您可以在reduce中完成所有工作时,为什么需要过滤器和映射?@charlietfl readability用于非玩具案例。如果可能的话,我正在寻找一种避免长时间减少的方法。这里有Array.from,我想我正在寻找Array.into,这样我就可以做[].filterj=>j%3.mapj=>j*5.intonew Set或类似的事情。与Java的where you can.collectCollectors.toSetOk类似,但仅仅因为该链看起来很酷,您就创建了两个额外的新数组,并进行了比实际更多的迭代necessary@charlietfl关于性能的观点。我倾向于选择非关键代码的可读性。