在一组布尔函数上运行 reduce。它总是返回 true 并且如果返回 false 则无法找到摆脱 reduce 方法的方法

Posted

技术标签:

【中文标题】在一组布尔函数上运行 reduce。它总是返回 true 并且如果返回 false 则无法找到摆脱 reduce 方法的方法【英文标题】:Running reduce on an array of Boolean functions. It always returns true and can't find a way to break out of the reduce method if one returns false 【发布时间】:2021-12-30 13:23:46 【问题描述】:

所以我应该创建一个有两个输入的函数:一个布尔函数数组和一个通过每个函数运行的值。我应该返回一个布尔值,指示是否所有函数都返回 true。如果至少有一个函数返回 false,那么 reduce 应该返回 false。

我遇到的问题是,即使其中一个函数的计算结果为 false 并且累加器设置为 false,如果在它之后的数组中有另一个函数会产生一个真值,那么它只会返回 true,即使前面的函数是假的。

我做了一些阅读,显然没有办法摆脱正在运行的 reduce 方法。

const allClear = (funcArr, value) => 
    // iterate through funcArr using reduce
  return funcArr.reduce((acc, fn) => 
    if (fn(value) === false) 
      return false;
     else 
      return true;
    
  , false)

这里是组成函数数组的测试用例以及对函数的两次调用...

const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];
console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

我已经尝试了很多我的功能变体,但都无济于事。一旦我将累加器设置为 false,它将被数组中的下一个函数设置回 true(说到第二个函数调用 -25),并且一旦我无法弄清楚如何突破 reduce 并返回 false通过运行函数找到错误的结果!

感谢您提供任何提示或帮助!

【问题讨论】:

I did some reading and apparently, there isn't really a way to break out of a running reduce method. 这就是我们有 Array.every 和 Array.some 的原因。对于这项特殊工作,Reduce 是错误的工具。 【参考方案1】:

回调函数应该检查累加器。如果是false,它应该只返回false,而无需调用下一个函数,因为这意味着至少有一个较早的函数返回了false

这也意味着累加器的初始值应该是true,否则你会立即停止。

此外,您可以使用!!fn(value) 调用的值转换为布尔值。

const allClear = (funcArr, value) => 
  // iterate through funcArr using reduce
  return funcArr.reduce((acc, fn) => 
    if (!acc) 
      return false;
    
    return !!fn(value);
  , true)


const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];
console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

【讨论】:

哇,多么巧妙的方法来保持蓄能器为假!从来没有想过,谢谢!【参考方案2】:

您可以使用Array#every

const allClear = (funcArr, value) => funcArr.every(fn => fn(value));

const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];

console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

使用Array#reduce 和logical AND &&

const allClear = (funcArr, value) => funcArr
        .reduce((r, fn) => r && fn(value), true);

const isOdd = num => num % 2 === 1;
const isPositive = num => num > 0;
const multipleOfFive = num => num % 5 === 0;
const numFnArr = [isOdd, isPositive, multipleOfFive];

console.log(allClear(numFnArr, 25)) // should log true 
console.log(allClear(numFnArr, -25)) // should log false

【讨论】:

谢谢!我应该澄清一下,出于某种愚蠢的原因,我不得不使用 reduce... 那么你必须迭代数组的所有项...

以上是关于在一组布尔函数上运行 reduce。它总是返回 true 并且如果返回 false 则无法找到摆脱 reduce 方法的方法的主要内容,如果未能解决你的问题,请参考以下文章

Reducer 总是返回初始状态 React-native

T-SQL 在一组条件中恰好有一个条件为真

Swift 函数不会很快返回

高手来,excel在一组数组中查找值,并返回对应的某一列的值,怎么实现

没有在布尔函数中获取/设置正确的返回值

如何从 Javascript 中的连续函数返回布尔值?