有关从化简函数返回布尔值的问题

时间:2019-06-07 20:16:14

标签: javascript reduce boolean-expression

我试图弄清楚为什么在我的化简函数中,可以将isTrue从true翻转到false,而在遇到返回false的函数时不能返回到false的原因。我只是想了解为什么它可以以一种方式翻转而不能以另一种方式翻转。

我知道翻转发生在return isTrue || val(num);

方向是“ //定义一个带有两个参数的函数” passOne”,第一个是任何值,第二个是函数数组。这些函数可以视为测试,因为它们都将返回true或false。 “ passOne”将遍历数组,并将其作为参数传递给每个函数。如果至少一个函数(测试)返回true,则“ passOne”将返回true。如果所有函数都不返回true,则“ passOne”将会返回false。//使用您的“ passOne”确定数字113是否为负数,甚至“或”的第一位为1。然后测试213。”

我尝试在Python Tutor中可视化它。

function isNeg(num){
  return num < 0 ? true: false;
}

function isEven(num){
  return num % 2 === 0 ? true : false;
}

function oneDig(num){
  return (num.toString())[0] === `1` ? true : false;
}

const funcs = [oneDig, isNeg, isEven];

// refactor "passOne" so that it uses the built-in "reduce" method instead of a "for" loop

function passOne(num, arr){
  return arr.reduce((isTrue, val) => {
    return isTrue || val(num);
  }, false);
}

console.log(passOne(113, funcs)); //true
console.log(passOne(213, funcs)); //false

代码的行为符合预期,我只是不明白为什么返回“ false”的回调不将isTrue翻转回“ false”,它如何保持“ true”,然后不更新为“ false”,而不是那就是指示说要做的,我很好奇。

4 个答案:

答案 0 :(得分:1)

false变成isTrue时,它再也不会变成true

因为您正在使用||运算符。考虑到isTruetrue。然后,什么回调返回整个值都将true无关紧要。

console.log(true || false)

实际上您不需要reduce(),因为其中一个条件为真,因此您无需进一步检查。在这种情况下,您应该使用some()

const passOne = (num, arr) => arr.some(x => x(num))

如果要翻转,则意味着您希望代码检查所有条件。然后,您需要使用&&运算符。然后将true而不是false传递给reduce()

function isNeg(num){
  return num < 0 ? true: false;
}

function isEven(num){
  return num % 2 === 0 ? true : false;
}

function oneDig(num){
  return (num.toString())[1] === `1` ? true : false;
}

const funcs = [oneDig, isNeg, isEven];

// refactor "passOne" so that it uses the built-in "reduce" method instead of a "for" loop

function passAll(num, arr){
  return arr.reduce((isTrue, val) => {
    return isTrue && val(num);
  }, true);
}

console.log(passAll(113, funcs)); //false
console.log(passAll(213, funcs)); //false
console.log(passAll(-122, funcs)) //true

另一种方法是every()

const passOne = (num, arr) => arr.every(x => x(num))

答案 1 :(得分:0)

您可以使用Array#some代替Array#reduce并返回回调结果。

const
    isNeg = num => num < 0,
    isEven = num => num % 2 === 0,
    oneDig = num => num.toString()[0] === '1',
    funcs = [oneDig, isNeg, isEven],
    passOne = (num, arr) => arr.some(fn => fn(num));

console.log(passOne(113, funcs)); //true
console.log(passOne(213, funcs)); //false

答案 2 :(得分:0)

对于113,

累加器已初始化false。 因此,第一次 isTrue将为假。因此它执行val(num)

如果逻辑“或”为假,则逻辑“或”将进入下一个条件,否则不会进入。

oneDig是arr中的第一项。 oneDig检查该数字的第一位数字是1。

因此对于113,第一个数字为1。因此它返回true。之后,因为isTrue = true满足LogicalOR,所以不执行其他两个val(num)。

对于213,

oneDig返回false。所以去val(num)

isNeg也返回false。所以它又回到val(num)

最终isEven也返回false。

所以像Array.prototype.some一样,检查arr中的任何函数都返回true,然后最终返回true,否则检查所有函数,如果没有任何结果返回true,则它将返回false

答案 3 :(得分:0)

我将使用some来测试数组中的至少一个元素是否通过了由提供的函数实现的测试。

const isNeg = num => num < 0;
const isEven = num => num % 2 === 0;
const oneDig = num => (num.toString())[0] === `1`;
const passOne = (num, arr) => arr.some(fn => fn(num));

const funcs = [oneDig, isNeg, isEven];

console.log(passOne(113, funcs)); //true
console.log(passOne(213, funcs)); //false