将给定数组转换为布尔数组,其中如果数字是素数,则每个元素为真,否则为假

convert the given array to an array of Boolean where Each element is true if the number is a prime number, and false otherwise

我需要找出数组中的某个数是否为素数。一开始我认为这很容易,但是.. :)

首先我尝试了这个版本:

function primeValues(arr) {
  let newArr = []
  for( let el of arr) {
    if (el <= 2 ) {
      newArr.push(true)
    }
    for (let j=2; j<el; j++) {
      if (el%j === 0) {
        newArr.push(false)
      } 
      if (el%j !==0 ) {
        newArr.push(true)
      } 
    }    
  }
  return newArr;
}  

console.log(primeValues([17, 3, 21]));

但每次它经过 for loop 时,它都会在我的新数组中推送 TrueFalse :/`

(35) [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true]

我该怎么办? :/

这样...

console.log( JSON.stringify( primeValues( [17, 3, 21 ] )))

function primeValues(arr)
  {
  let result = [], modulo;
  for( let el of arr) 
    {
    if (el <= 2 ) 
      result.push(true)
    else                  // this one is missing in your code
      {
      modulo = 1          // modulo initial assignement must be there
      for (let j = 2; j < el; j++) // or (let j=3; j<el; j +=2)
        {                        // see Alexey Zelenin explanations 
        modulo = el % j
        if (modulo === 0) 
          {
          result.push(false)
          break          // this other one is missing in your code
          } 
        } 
      if (modulo !== 0)  result.push(true) // test last modulo value
      }                                  // outside the loop (and it's scope)
    }
  return result;
  }

但您可能更喜欢这样编码:

console.log( JSON.stringify( primeValues([ 17, 3, 21 ] )))

function primeValues(arr)
  {
  let result = []
    , isNotPrim
    ;
  for (let el of arr) 
    {
    isNotPrim = false    
    if (el > 2)
    for (let j = 2; j < el; j++) 
    if (isNotPrim = !(el %j))   
      break
      ;
    result.push( !isNotPrim )
    }
  return result;
  } 

function primeValues(arr) {
  return arr.map(element => {
    const x = Math.abs(element);
    if(x <= 2) return true;
    if(x % 2 === 0) return false;
    for(let i = 3; i <= Math.sqrt(x); i+=2) {
      if(x % i === 0) {
        return false;
      }
    }
    return true;
  });
}

console.log(primeValues([7,9,11,13,-21,2,54]));

我对代码进行了一些优化

  1. 我们只检查奇数,因为如果元素不能被 2 整除,则它不能被偶数整除。
  2. 我们不需要检查所有小于“元素”的数字 - 我们只需要检查从 3 到元素的平方根的数字。如果你需要任何额外的解释为什么 - 我可以给它。
  3. 我建议使用“map”而不是创建一个数组并推送到那里——这样效率更高。此外,它还可以防止您错过“else”和“break”语句 - 当 truefalse 添加到答案列表时,每个检查都会立即完成。

更新:添加了Math.abs函数调用,因此负数将被正确处理。