测试所有数组元素是否都是数量因子

时间:2019-04-06 13:04:55

标签: javascript arrays loops if-statement

我有以下问题:

  

编写一个函数,如果数组中的所有整数都是数字因子,则返回true,否则返回false。

我尝试了以下代码:

function checkFactors(factors, num) {

  for (let i=0; i<factors.length; i++){
    let element = factors[i];
      console.log(element)

    if (num % element !== 0){
      return false 
    }
    else {
      return true
    }
  }
}

console.log(checkFactors([1, 2, 3, 8], 12)) //➞ false

我的解决方案返回true,这是错误的。我知道是else语句弄糟了它。但是我想理解为什么else语句不能去那里。

6 个答案:

答案 0 :(得分:7)

您正在一家巧克力店工作,老板告诉您是否检查所有巧克力(有辣椒巧克力焦糖巧克力咖啡巧克力< / em>)。他告诉你以下内容:

遍历所有巧克力,并为每种巧克力品尝,如果还可以,告诉我一切都很好,否则告诉我有什么问题¹

您从第一个巧克力开始,这是辣椒巧克力,它尝起来很美味,您去找老板并告诉他一切都很好。您的老板对您大喊,因为您还没有品尝过焦糖巧克力咖啡巧克力

您意识到老板确实希望您这样做:

仔细检查一下巧克力,对每种巧克力都品尝一下,如果味道不好,请立即告诉我,否则继续进行直到您品尝到全部,然后回到我身边,告诉我一切都很好。 / em>²

或在代码中

 // ¹
  function checkChocolates(chocolates) {
    for(const chocolate of chocolates) {
       if(isTasty(chocolate)) {
         return true;
       } else {
         return false;
       }
    }
 }

 // ²
 function checkChocolates(chocolates) {
   for(const chocolate of chocolates) {
     if(isTasty(chocolate)) {
       continue; // this could be omitted, as a loop keeps looping nevertheless
     } else {
       return false;
     }
   }
   return true;
 }

由于这是编程中非常常见的任务,因此已经存在一种表达这种情况的较短方法:

 if(chocolates.every(isTasty)) {
   alert("all chocolates are fine");
 } else {
    alert("Oh, that doesnt taste good");
 }

isTasty是一个获取巧克力并返回true或false的函数。


如果您还不了解它,只需尝试一下!买些巧克力,品尝一下!如果有人告诉您“吃巧克力没有学习”,请回答“我在做rubber duck debugging”,没有人可以抱怨:)

答案 1 :(得分:5)

只需在循环外返回true,

如果您将return true中的else part保留在num % element !== 0中,则您的代码将return true保留在1中,在这种情况下,重新检查数组中的所有值应该是给定数字的因数

  

让我们以第一个例子为例

  • 在数组num % element !== 0的第一个元素上,它将检查条件return true的结果是否为假,因此它将转到函数的else条件和return true,而不检查其余部分值。
  • 因此,您需要在末尾保留return true,以便如果循环中的任何值都不满足if条件,那么只有控制权会转到function checkFactors(factors, num) { for (let i=0; i<factors.length; i++){ let element = factors[i]; if (num % element !== 0){ return false } } return true } console.log(checkFactors([1, 2, 3, 8], 12)) //➞ false console.log(checkFactors([1, 2], 2))

failing case

  

简而言之-在这种情况下,如果您希望所有人都必须符合条件作为经验法则,您可以将其视为

  1. passing case返回值保留在for循环中
  2. 在函数末尾保留function checkFactors(factors, num) { return factors.every(element => num % element === 0); } console.log(checkFactors([1, 2, 3, 8], 12)); console.log(checkFactors([1, 2], 2));返回值

JS对于此类情况有内置的方法Array.every

var activeInfoWindow; 

答案 2 :(得分:1)

在循环内,对输入num进行了除法测试,如果可以将num整除,则控件将进入函数else返回的true块中。 。

循环没有检查输入数组的所有数字,当第一个数字可分割时,该循环返回true

只需使用一个标志变量,即可查看所有元素是否可被输入数字num整除,如果无法将任何元素整除,则flag将设置为{ {1}},然后我们可以false跳出循环并返回它,因为没有意义检查其他数字。

break

您也可以使用Array.every进行简洁的检查:

function checkFactors(factors, num) {
  let flag = true;
  for (let i=0; i<factors.length; i++){
    let element = factors[i];
    if (num % element !== 0){
      flag = false;
      break;
    }
  }
  return flag;
}

console.log(checkFactors([1, 2, 3, 8], 12)); 
console.log(checkFactors([1, 2], 2));
console.log(checkFactors([2, 4, 3, 6, 9], 12));
console.log(checkFactors([3, 5, 2, 6, 9], 15));
console.log(checkFactors([4, 2, 8, 1], 16));

答案 3 :(得分:0)

是的,“其他”引起了问题。我删除了它,并在for循环之外添加了“ return true”。

function checkFactors(factors, num) {

  for (let i=0; i<factors.length; i++){
    let element = factors[i];
      console.log(element)

    if (num % element !== 0){
      return false 
    }
  }
  return true;
}

答案 4 :(得分:0)

您的代码逻辑错误。您应该检查数组的所有Elements,如果所有元素都满足条件,则返回true,但是如果其中一个元素不满足条件,则立即返回false。 else表示一项满足条件,但不是所有要素。那就是问题所在。

答案 5 :(得分:0)

const checkFactors = (factors, num) => factors.reduce((acc, x)=>acc && num%x===0);

const checkFactors = (factors, num) => factors.every(x => num%x===0);