在多维数组中推送数组

时间:2013-04-28 18:19:49

标签: javascript arrays push multidimensional-array

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

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);

4 个答案:

答案 0 :(得分:0)

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

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的使用更改为[]

  

{}和[]

     

使用{}代替新的Object()。使用[]代替new 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?不使用slice,因为数组只包含基元,因此当数组的长度设置为0时,数据就会丢失。

number.toFixed的使用更改为Math.floor,以便randNum保持为数字

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

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

答案 1 :(得分:0)

代码中第一眼看到两个错误的东西

(1)而不是

randNum = (10*Math.random()).toFixed(0);
你可能想要

randNum = Math.floor(11*Math.random());
  • Math.floor而不是toFixed() - 请参阅@kennebec comment
  • 11而不是10来返回0到10之间的数字0 <= Math.random() < 1

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

bigarray.push(smallarray);

在下一步中,使用smallarray.length = 0清除阵列。由于数组未复制到bigarray,只是被引用,因此生成的项目将丢失。

编辑:我读错了你的问题 - 答案的其余部分已修复

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

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

答案 2 :(得分:0)

    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);

答案 3 :(得分:0)

你需要在主要的一个循环中填充smallarray,例如:

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)
}