我有以下问题:
编写一个函数,如果数组中的所有整数都是数字因子,则返回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语句不能去那里。
答案 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
简而言之-在这种情况下,如果您希望所有人都必须符合条件作为经验法则,您可以将其视为
passing case
返回值保留在for循环中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);