在一组布尔函数上运行 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 方法的方法的主要内容,如果未能解决你的问题,请参考以下文章