我正在尝试找到最简单的方法来查找数组中每个数字的因子,而无需使用循环。我有一段 ES6 代码片段,我认为可以在 .map 中使用它来避免循环,但我不知道它在第二行中做了什么。
我已经查看了 MDN 上的 .filter 和 .from 方法,因此我们通过调用 Array() 从看似空的可迭代对象浅层复制数组实例,但随后我无法描述之后都是英文的,这让我感到不安。
let evens = [2,4,6,80,24,36];
这是我试图用英语解构/解释的 ES6 片段
const factor = number => Array
.from(Array(number), (_, i) => i)
.filter(i => number % i === 0)
所以我像这样把它放到了这个.map中
const factors = evens.map((number => {
return factors(number)
}))
console.log(factors)
我得到了一个由因子数组组成的数组,如下所示
[ [ 1 ],
[ 1, 2 ],
[ 1, 2, 3 ],
[ 1, 2, 4, 5, 8, 10, 16, 20, 40 ],
[ 1, 2, 3, 4, 6, 8, 12 ],
[ 1, 2, 3, 4, 6, 9, 12, 18 ] ]
所以...它有效,但是第二行发生了什么?我喜欢它的简洁性,但是当我尝试将其逆向工程为非 ES6 时,我感到很疑惑。
提前感谢 ES6 的高级人员。
最佳答案
这里有很多东西需要解压。
首先,“不使用循环”。您能解释一下您提出这一要求的原因吗?并不是说我没有同情心,因为我通常会避免显式循环,但您确实应该能够解释为什么要这样做。有两种根本不同的方法来处理有序集合:迭代循环和递归。如果您不使用递归代码,则可能在某处隐藏着循环。它可能被埋在 map
、filter
等中,这通常是一种改进,但该循环仍然存在。
其次,该代码片段的布局相当具有误导性:
const factor = number => Array
.from(Array(number), (_, i) => i)
.filter(i => number % i === 0)
通常,当多行开始 .methodName(...)
时,每个方法都会对前一行提供的数据进行操作。但这里的from
只是Array
的一个静态方法;像这样将它们分开是令人困惑的。其中任何一个都会更好,就像许多其他布局一样:
const factor = number =>
Array.from(Array(number), (_, i) => i)
.filter(i => number % i === 0)
const factor = number => Array.from(
Array(number),
(_, i) => i
).filter(i => number % i === 0)
第三,正如评论和另一个答案所指出的,Array.from
接受一个可迭代的和一个映射函数并返回一个数组,Array(number)
将给出您是一个没有值的数组,但将其长度报告为数字,因此将作为适当的可迭代对象。有许多等效的方法可以这样写,例如:
Array.from({length: number}, (_, i) => i)
[...Array(number)].map((_, i) => i)
第四,你提到这一点:
const factors = evens.map((number => {
return factor(number)
}))
(已修复拼写错误)
虽然这没有什么问题,但您可能想认识到这可以写得更干净,如
const factors = evens.map(factor)
最后,分解代码缺少重大的性能调整。当您确实可以找到成对的因子时,您可以测试最多n
的每个可能值,仅测试最多sqrt(n)
。这是一个主要区别。没有已知的有效分解技术,这可能是一件好事,因为现代加密依赖于这是一个难题。但您很可能不想让事情变得更糟。
关于javascript - 这是使用 ES6 最有效地查找因子而无需循环的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55463490/