【问题标题】:array function that generates array with subset range of numbers生成具有数字子集范围的数组的数组函数
【发布时间】:2018-10-20 10:04:52
【问题描述】:

我正在尝试创建一个函数,该函数将数组构建到由函数参数设置的数字,并根据余数是否为零来包含 if 条件。数组中的最后一个数字不应高于参数。到目前为止,这是我想出的——

function justThreesUpTo(num) {  
var array = [];
array.length = num; 
for (i = 1; i < array.length; i++) {
  if(i % 3 === 0){
    array.push(i);
  }
    else i;
  }
  array.splice(0, num);
  return array;
}

当我使用 justThreesUpTo(20) 控制台记录此内容时,我得到 --

// [ 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42 ]

我发现问题是在 array.length 处设置限制器,这会最大限度地增加数组中可以包含的项目数,但我无法弄清楚要调用什么来确保数组中的最后一个数字不高于函数调用指定的“num”参数。有什么想法吗?

【问题讨论】:

  • 这个函数的目的是什么? else 部分在做什么?

标签: javascript arrays


【解决方案1】:

嗯。看起来这是一个非常简单的解决方案。将限制器从“array.length”更改为“num”,效果很好。

function justThreesUpTo(num) {
var array = [];
array.length = num; 
for (i = 1; i < num; i++) {
  if(i % 3 === 0){
      array.push(i);
  }
  else i;
  }
  array.splice(0, num);
  return array;
}

没关系!

【讨论】:

    【解决方案2】:

    在循环遍历数组时修改数组(或其索引,这就是您对 i &lt; array.length 所做的事情)会导致混淆。从一个空数组开始,然后与 num 进行比较:

    function justThreesUpTo(num) {
        var array = [];
    
        for (var i = 1; i < num; i++) {
            if (i % 3 === 0) {
                array.push(i);
            }
        }
    
        return array;
    }
    

    现在您可以通过每次上移适当的数量来完全优化结帐。

    function justThreesUpTo(num) {
        var array = [];
    
        for (var i = 3; i < num; i += 3) {
            array.push(i);
        }
    
        return array;
    }
    

    (在您的原始代码中,array.length = num; 创建的整个第一个 num 孔都未使用并被拼接掉,else i 什么也不做。)

    【讨论】:

    【解决方案3】:

    在填充数组之前将数组的长度设置为某个值并不是一个好主意 - 最好只迭代 num 本身。例如

    for (var i = 1; i < num; i++) {
      // push to array if i % 3 === 0
    

    您的 else i 不会做任何事情 - 您可以完全关闭它。

    如果你愿意,你可以让你的代码更短更简洁:

    function justThreesUpTo(num) {
      const length = Math.floor(num / 3);
      return Array.from({ length }, (_, i) => (i + 1) * 3);
    }
    console.log(justThreesUpTo(20));

    【讨论】:

    • 好多了。一个小时后我意识到这不是一个很好的解决方案,但也希望该函数同时为分频器(2、3 等)和限制器输入。所以在这种情况下, (num, div) 并将长度常量中的“/ 3”更改为“/ div” - 似乎工作正常。
    【解决方案4】:

    您可以尝试使用简单的while 循环

    function justThreesUpTo(num) {  
       var array = [];
       var i = 0;
    
       while (i < num) {
         if(i % 3 === 0){
           array.push(i);
         }
         i++;
       }
       return array;
    }
    
    console.log(justThreesUpTo(20));

    【讨论】:

      【解决方案5】:

      while 循环内使用whilei+=3;

      function justThreesUpTo(num) {  
        var array = [];
        var i = 0;
        while(i<num){
          array.push(i);
          i+=3;
        }
        return array;
      }
      
      console.log(justThreesUpTo(20));

      【讨论】:

      • @Ry- 非常正确。编辑了答案。感谢您的建议
      • 比我最初的尝试更好的另一种方法。使用两个参数也可以轻松工作,这是我试图结束的地方。请参阅先前评论中的 repl.it。
      【解决方案6】:

      您可以使用map 方法和传播语法来编写干净的解决方案。

      function justThreesUpTo(num) {  
         return [ ...Array(Math.floor(num/3)).keys() ].map((_,i)=> (i+1) * 3);
      }
      console.log(justThreesUpTo(20));

      【讨论】:

        猜你喜欢
        • 2016-06-12
        • 2015-05-31
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        相关资源
        最近更新 更多