javascript - 这是使用 ES6 最有效地查找因子而无需循环的方法吗?

标签 javascript arrays ecmascript-6 factors

我正在尝试找到最简单的方法来查找数组中每个数字的因子,而无需使用循环。我有一段 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 的高级人员。

最佳答案

这里有很多东西需要解压。

首先,“不使用循环”。您能解释一下您提出这一要求的原因吗?并不是说我没有同情心,因为我通常会避免显式循环,但您确实应该能够解释为什么要这样做。有两种根本不同的方法来处理有序集合:迭代循环和递归。如果您不使用递归代码,则可能在某处隐藏着循环。它可能被埋在 mapfilter 等中,这通常是一种改进,但该循环仍然存在。

其次,该代码片段的布局相当具有误导性:

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/

相关文章:

javascript - 在页面加载时隐藏 div

javascript - Internet Explorer 11 JavaScript Let 语句

javascript - 为什么这个正则表达式必须用括号括起来才能匹配?

PHP 数组在 foreach 上的转换不会通过引用传递变量

c - 使用 fscanf 在结构数组中设置结构的属性

异步调用后 JavaScript ES6 调用 "super"

javascript - 使用 ES6 保存函数 mongoose

javascript - ES6 promise : how to chain functions with arguments

javascript - jQuery .scroll 像电影一样改变背景

php - 插入数组