【问题标题】:I need to test a set of Jackpot results. I need a function which returns true if all results are identical, and false if they are different我需要测试一组累积奖金结果。我需要一个函数,如果所有结果都相同则返回 true,如果它们不同则返回 false
【发布时间】:2020-03-04 22:06:14
【问题描述】:
这是我目前所拥有的:
const testJackpot = result => {
if (!result.length)
return true;
return result.reduce((a, b) => {
return (a === b) ? a : (!b);
}) === result[0];
}
console.log(testJackpot(["@", "@", "@", "@"]))
代码似乎可以工作,但是我不明白具体是如何工作的。
以下说法的原因是什么:
if (!result.length)
return true;
我需要帮助了解.reduce() 方法在此处的运作方式。
【问题讨论】:
标签:
javascript
function
reduce
【解决方案1】:
Array#reduce 是错误的工具,因为它会迭代数组的所有元素,并且您得到的结果也需要在 and 处进行检查。
您可以改用Array#every 并对照第一个元素检查每个元素。
此方法根据需要为空数组返回 true。
const testJackpot = array => array.every((v, _, a) => v === a[0]);
console.log(testJackpot([]));
console.log(testJackpot(["@", "@", "@", "@"]));
console.log(testJackpot(["@", "@", "", "@"]));
【解决方案3】:
我同意其他两个答案,使用.every() 是一种更好的方法。
但是,要回答您的实际问题,
if(!result.length)
return true;
如果数组为空,Array.length 返回 false,即长度为零等于 false。
检查返回 true。
您可以将.reduce() 视为一个for 循环。
return result.reduce((a, b) => {
return (a === b) ? a : (!b);
}) === result[0];
'a' 参数是累加器/保持器和第一次迭代值,'b' 是下一次迭代值
所以这里发生的是,如果迭代值“b”与“a”匹配,则“a”返回给累加器/持有者,如果不匹配,则返回 b。然后在迭代所有项目之后,代码检查返回的值(累加器/持有者 - 或在本例中为“a”)是否与数组中的第一项匹配。如果所有项目都匹配,则“a”将永远不会更改,但是一旦找到不匹配的项目,“a”就会更改并且不再匹配第一个项目。
我希望这有助于阐明正在发生的事情。
【解决方案4】:
您可以使用 SET 对象来查找数组中的唯一值。
function testJackpot(arr) {
const set1 = new Set();
for (var i = 0; i < arr.length; i++) {
set1.add(arr[i])
}
if (set1.size == 1) {
return true;
}
return false;
}
console.log(testJackpot(["@", "@", "@", "@"]))