首页 > 解决方案 > 数组过滤器不过滤

问题描述

我正在尝试过滤一组随机数以提取素数。

我有一个工作函数 ( isPrime) 似乎返回truefalse正确返回,但数组中的每个数字都被“过滤”到过滤器返回的数组中。

我查看了过滤器的文档并观看了一些视频,但我还没有弄清楚,我认为这可能与过滤器内部的函数调用有关。你能告诉我我的错误在哪里吗?

numArray = [];

for(i=0; i<1000; i++){
  numArray.push(Math.random(1000));
}

const isPrime = (num) => {
  for(i=2;i<num;i++){
    if(num % i === 0){
      return false;
    }
  }
  return true;
}

const results = numArray.filter(value => isPrime(value));
  
for(num in results){
  console.log(num);
  console.log(isPrime(num)) //added to demonstrate function is working and should return false to the filter                        
}

标签: javascriptarraysfunctionfilterprimes

解决方案


您以错误的方式生成随机数。您的代码将仅创建一个浮点数组,1根据您的要求isPrime,它们都将是素数。

注意:不要使用没有的变量,let否则cosnt会导致代码出现很多问题。

如何创建随机数?

  • Math.random()0是返回和之间的浮点数的函数1
  • 您将该数字乘以您想要的最大范围。
  • 相乘后它仍然是一个浮点数。所以使用Math.floor()将随机浮点数舍入为整数

let numArray = [];

for(let i=0; i<10; i++){
  numArray.push(Math.floor(Math.random() * 30));
}

const isPrime = (num) => {
  for(let i=2;i<num;i++){
    if(num % i === 0){
      return false;
    }
  }
  return true;
}

const results = numArray.filter(value => isPrime(value));

console.log(JSON.stringify(numArray))
console.log(JSON.stringify(results));

回答OP的问题

“为什么用于检查代码的循环底部给出数字 5、6 ... 997、998”

在 javascript 中,数组基本上是对象。这for..in是一个循环,它遍历对象的而不是值。因此,如果数组键是0...999上述情况下的数组索引。所以它正在记录那些索引


推荐阅读