【问题标题】:Checking whether array has a number bigger than specified检查数组是否有大于指定的数字
【发布时间】:2021-10-17 19:57:50
【问题描述】:

我想写一个函数,它以数组为参数并返回有多少个数可以除以 12。但是,如果数组有一个大于 111 的数字,那么它应该返回 0; 我是这样写的:

function isDivisble(array) {
  let numberOfNum = 0;
  for(let i=0; i < array.length; i++) {
    if(array[i] % 12 == 0 && array[i] < 111) {
      numberOfNum = numberOfNum + 1 ;
    } else {
      numberofNum = 0;
    }
  }
  return console.log(numberOfNum);
}

let test = [12, 24, 36, 44, 55, 255];


isDivisble(test)

我意识到这段代码单独检查当前数字是否可整除且不大于 111,而不是全局检查数组是否有大于 111 的数字,但我不明白如何进行一般数组检查。 是否用 if 语句编写 for 循环进行检查,然后在 if 语句中编写另一个 for 循环使其有点意大利面?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    你可以先用 some 来检查是否有任何大于 111 的元素。 然后您可以使用过滤器来获取可被 12 整除的元素。 像这样:

    const isDivisible = (arr) => {
        if (arr.some((e) => e > 111)) return 0;
        return arr.filter((e) => e % 12 === 0).length;
    };
    const test = [12, 24, 36, 44, 55, 48];
    console.log(isDivisible(test));

    【讨论】:

      【解决方案2】:

      我稍微修改了你的函数,如果一个数字大于 111 则返回 0,否则它会检查它是否能被 12 整除

      function isDivisble(array) {
        let count = 0;
        for(let i=0; i<array.length; i++){
          if(array[i] > 111){
              return 0;
          }else{
              if(array[i] % 12 === 0){
              count++
            }
          }
        }
        return count;
      }
      
      
      let test = [12, 24, 36, 44, 55, 255];
      console.log(isDivisble(test));

      【讨论】:

        【解决方案3】:

        some 数组方法可以解决问题:

        array.some(value =&gt; { return value &gt; 111 }) 将在其任何值大于 111 时返回 true。

        您还可以通过使用array.every 和类似的回调来检查每个数组值是否符合特定条件:

        array.every(value =&gt; { return value &lt;= 111 }) 仅当数组中的每个值都小于或等于 111 时为真。

        【讨论】:

          【解决方案4】:

          最好的通用解决方案是下面的 oene 逻辑

          • 过滤数组以获取大于111 的数字。如果此过滤器返回一个长度大于 1 的数组,则返回 0
          • Else 过滤数组中可被 12 整除的数字。无需检查数字是否小于 111。因为如果该数字大于111,该函数可能已经返回0
          • 重新调整上述过滤器的长度。

          工作小提琴

          function isDivisbleGeneric(arr) {
              const numberGreaterThanLimit = arr.filter((node) => node > 111);
              let returnCount;
              if(numberGreaterThanLimit.length > 0) {
                  returnCount = 0;
              } else {
                  const divisibleBy12 = arr.filter((node) => node %12 === 0);
                  returnCount = divisibleBy12.length;
              }
              return returnCount;
          }
          let test = [12, 24, 36, 44, 55, 255];
          const count = isDivisbleGeneric(test);
          console.log(count);

          单线解决方案

          const isDivisbleOneLine = (arr) => arr.filter((node) => node > 111).length > 0 ? 0 : arr.filter((node) => node %12 === 0).length;
          let test = [12, 24, 36, 44, 55, 255];
          const count = isDivisbleOneLine(test);
          console.log(count);

          【讨论】:

          • OP 声明如果数组的任何单个成员大于或等于 111,则该函数应返回 0。
          【解决方案5】:

          function isDivisble(array) {
          
            // at the beginning, do from here
            if (array.some(p=>p > 111)) {
              return 0;
            }
          
            // Rest xxxxxx
          }

          【讨论】:

          • 这是不正确的。 else 会将可被 12 整除的值的计数清零。
          猜你喜欢
          • 2021-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-07
          相关资源
          最近更新 更多