【问题标题】:pushing arrays in multidimensional array在多维数组中推送数组
【发布时间】:2013-04-28 18:19:48
【问题描述】:

一旦其内容的总和即将超过 30,我想将包含随机数(0 到 10)的数组推入一个更大的数组中。但是输出搞砸了。

var bigarray = new Array();
var smallarray = new Array();

var randNum = 0;
var total = 0;

for (var i = 0; i<10; i++){

    randNum = (10*Math.random()).toFixed(0);
    total = total + randNum;


    if(total>30) {

        bigarray.push(smallarray)

        smallarray.length=0;
        smallarray.push(randNum);
        total = randNum;

    } else {

        smallarray.push(randNum);

    }

}

alert(" BIG ARRAY IS "+bigarray);

【问题讨论】:

标签: javascript arrays push multidimensional-array


【解决方案1】:

在代码中一眼就能看出两个错误

(1) 而不是

randNum = (10*Math.random()).toFixed(0);

你可能想要

randNum = Math.floor(11*Math.random());
  • Math.floor 而不是 toFixed() - 请参阅 @kennebec 评论
  • 11 而不是 10 返回数字 0 到 10,如 0 &lt;= Math.random() &lt; 1

(2) 以下行将引用(多次)推送到同一个 smallarray 对象。

bigarray.push(smallarray);

在下一步中,您使用smallarray.length = 0 清除数组。因为数组没有复制到bigarray,只是引用,所以生成的item会丢失。

编辑:我读错了你的问题 - 答案的其余部分是固定的

您可能希望将 smallarray 的副本推送到 bigarray,因此将上面的行替换为以下内容:

bigarray.push(smallarray.slice(0));

【讨论】:

    【解决方案2】:

    您需要在主循环中使用另一个循环来填充小数组,例如:

    var bigarray = new Array();
    
    for (var i = 0; i<10; i++){
    
        // moving the variable declarations inside this loop means they are re-set for each small array
        var smallarray = new Array();
        // create the first entry for the small array
        var randNum = Math.floor(11*Math.random());
        var total = randNum;
    
        // loop to populate the small array
        while(total <= 30){
            smallarray.push(randNum);
            randNum = Math.floor(11*Math.random());
            total += randNum;
        }
        bigarray.push(smallarray)
    }
    

    【讨论】:

      【解决方案3】:

      我对您的代码进行了更改并想出了这个。

      var bigarray = [];
      var smallarray = [];
      
      var randNum = 0;
      var total = 0;
      
      for (var i = 0; i < 10; i += 1) {
          randNum = Math.floor(10 * Math.random()); // you will never have a value of 10?
          total = total + randNum;
      
          if (total > 30) {
              bigarray.push(smallarray.slice())
              smallarray.length = 0;
              smallarray.push(randNum);
              total = randNum;
          } else {
              smallarray.push(randNum);
          }
      }
      
      alert(" BIG ARRAY IS " + bigarray);
      

      开启jsfiddle

      我改变的是:

      通过beautifier 运行代码

      将您对new Array 的使用更改为[]

      {} 和 []

      使用 {} 而不是 new Object()。使用 [] 而不是 new Array()。

      因为 Object 和 Array 可以被用户覆盖

      ++ 更改为+= 1

      这种模式可能会令人困惑。

      查看Code Conventions for the JavaScript Programming Languagejslint

      当您将smallarray 推送到bigarray 时添加了array.slice,在这种情况下会生成一个副本。了解javascript的工作原理很重要,阅读Is JavaScript a pass-by-reference or pass-by-value language? 不使用切片,因为数组只包含原语,所以当您将数组的长度设置为0时,数据会丢失。

      number.toFixed 的用法更改为 Math.floor,这样 randNum 仍然是一个数字

      注意:Math.random 返回一个浮点伪随机数,范围为 [0, 1],即从 0(包括)到但不包括 1(不包括)

      您的代码现在是否产生了您的预期结果,我无法从您的描述中确定,但这应该是一个很好的起点。

      【讨论】:

      • 太棒了!万分感谢。那么,当您使用 push 而不是 slice 和数组时会发生什么?当涉及到数组时,'push' 的行为会有所不同吗?
      • 我用链接和一些进一步的解释更新了答案,试图为你澄清情况。
      【解决方案4】:
          var bigarray = new Array();
          var smallarray = new Array();
          var randNum = 0;
          var total = 0;
          for (var i = 0; i < 10; i++) {
              for (var j = 0; j < smallarray.length; j++) {
                  total = total + smallarray[j];
              }
              if (total <= 30)
              { 
                  randNum = Math.floor((Math.random() * 10) + 1);
                  smallarray.push(randNum);
              }
              else {
                  bigarray.push(smallarray.slice(0));                
                  smallarray.length = 0;
              }
              total = 0;    
      
          }
          alert(" BIG ARRAY IS " + bigarray);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多