Javascript避免嵌套循环

时间:2017-03-30 22:45:06

标签: javascript arrays

我注意到,当有更好的选项时,我的算法解决方案通常包含丑陋的嵌套for循环。在下面的示例中,如何在没有嵌套循环的情况下确定给定参数的素数?赋值的一个约束是使用任何外部函数。

function sumPrimes(num) {
    var p = [];
    for (var i = 2; i <= num; i++)
    {
        p.push(i);
        for (var j = 2; j < i; j++)
        {
            if (i % j === 0) //not a prime
            {
                p.pop(i);
                break;
            }
        }
    }
    return p;

1 个答案:

答案 0 :(得分:0)

我不知道是否有其他好的解决方案,但我想出了这个。还有一个for循环;)

function primes(num) {
  return Array.apply(null, {length: (num + 1)}).map(Number.call, Number)
   .filter(function(n) {
     for(var i = 2; i < n; i++) {
       if(n % i === 0) return false;
     }
     return n !== 0 && n !== 1;
   })
 }

说明:

Array.apply(null, {length: (num + 1)}).map(Number.call, Number)

此行创建一个具有传递参数范围的Array。如果num5,则会创建以下数组:[0, 1, 2, 3, 4, 5]。我找到了here

然后我使用filter函数删除所有非素数。如果过滤器函数返回false,则数字将从数组中删除。因此,在过滤器函数中,我们检查当前数字是否为素数。如果是,则返回true。正如你所看到的,我仍然在这里使用普通for循环。

不,你可以按如下方式调用该函数:primes(28);

这将返回以下数组:[ 2, 3, 5, 7, 11, 13, 17, 19, 23 ]

在这种特殊情况下我会说使用normal for循环是绝对可以的。但是,当您对数组进行操作时,请始终考虑mapreducefilter等函数。