【问题标题】: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(["@", "@", "", "@"]));

    【讨论】:

      【解决方案2】:

      只需使用内置在 javascript 数组中的“every”方法。

      ["@", "@", "@", "@"].every(item => item === "@")
      

      在此处查看更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every

      【讨论】:

        【解决方案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(["@", "@", "@", "@"]))
          

          【讨论】:

            猜你喜欢
            • 2022-01-17
            • 1970-01-01
            • 2020-09-11
            • 1970-01-01
            • 2018-10-22
            • 1970-01-01
            • 1970-01-01
            • 2013-04-09
            相关资源
            最近更新 更多