关于从 reducer 函数返回布尔值的问题

Question about returning a boolean from a reducer function

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

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

Directions were "// define a function "passOne" 它接受两个参数,第一个是任意值,第二个是函数数组。这些函数可以被认为是测试,因为它们都将 return true 或 false。"passOne" 将 iterate/loop 通过数组并将值作为参数传递给每个函数。如果至少一个函数(测试)return 为真,"passOne" 将 return 为真。如果函数 return 的 none 为真,则 "passOne" 将 return 为假。// 使用你的 "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

代码按预期运行,我只是不明白为什么 return 'false' 不翻转 isTrue 回到 'false' 的回调,它如何保持 [=38] =] 然后不更新到 'false',不是说明上说的那样,我只是好奇。

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

因为您正在使用 || 运算符。考虑 isTruetrue。那么不管什么回调 returns 整个值都会 true.

console.log(true || false)

这里实际上不需要 reduce() 因为其中一个条件为真你不需要检查 further.You 在这种情况下应该使用 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))

您可以采用 Array#some instead of Array#reduce 和 return 回调的结果。

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

对于 113,

累加器已 false 初始化。 所以第一次 isTrue 将是 false。所以它执行 val(num).

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

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

所以对于 113,第一个数字是 1。所以它 return 是真的。因为 isTrue = true 满足 LogicalOR.

,所以在其他两个 val(num) 之后不执行

对于 213,

oneDig return 错误。所以它转到 val(num)

isNeg returns 也为假。所以它再次进入 val(num)

最后 isEven 也 returns false。

所以它就像 Array.prototype.some 检查 arr return 中的任何函数,最后它 returns true 否则检查所有函数,如果没有 return 为真,它将 return 为假

我会使用 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