循环中的数组

时间:2014-03-24 20:17:03

标签: javascript arrays loops

创建一个小应用程序来生成随机数。请参阅小提琴here

生成数字的函数存在问题。有3个变量控制输出。集合/序列中的数字计数,集合的数量,以及限制生成的数字,最大数量的数字。

我创建了2个循环来生成集合中的数字。内部循环创建一组数字(数组),外部循环将该集合添加到另一个数组setArr

所以我创建了2个数组。将保存当前生成的集合temp的集合,以及将保存整个集合的集合setsArr

内部循环创建一个集合,外部循环将创建的集合推送到setsArr。在再次执行之前,我清空了temp数组。所以这一直在继续。

但这不起作用。我肯定错过了什么。有什么帮助吗?

function gen() {
    var cols = document.getElementById("cols").value;
    var sets = document.getElementById("sets").value;
    var max = document.getElementById("max").value;

    var setsArr = [];
    var temp    = [];

    for (var i = 0; i < sets; i++) {
        for (var j = 0; j < cols; j++) {
            var num = Math.floor(Math.random() * max);
            temp.push(num);
        }
        setsArr.push(temp);
        temp.length = 0;
    }

    console.log(setsArr);
}

5 个答案:

答案 0 :(得分:2)

当您将temp数组推送到setsArr时,它不会被复制但会被引用。清空它将清空setsArr中的数组。此外,当总是推送相同的数组时,您将获得setsArr[0] == setsArr[1] ...

而是在每次迭代时创建一个新的数组对象:

var setsArr = [];

for (var i = 0; i < sets; i++) {
    var temp = [];
    for (var j = 0; j < cols; j++) {
        var num = Math.floor(Math.random() * max);
        temp.push(num);
    }
    setsArr.push(temp);
}

答案 1 :(得分:1)

jsFiddle Demo

将数组的长度设置为0会影响放入父数组的每个数组。相反,在那里使用局部变量,它将创建一个每次使用的新实例。这将适当地允许唯一的数组。

var setsArr = [];

for (var i = 0; i < sets; i++) {
    var temp = [];//local array instantiated
    for (var j = 0; j < cols; j++) {
        var num = Math.floor(Math.random() * max);
        temp.push(num);
    }
    setsArr.push(temp);//save unique array
}

答案 2 :(得分:0)

问题在于这一行:

temp.length = 0;

将数组长度设置为0会清除其内容。这就是你的数组为空的原因。

答案 3 :(得分:0)

DEMO

使用局部变量,然后删除局部变量,不要等待垃圾收集器。

for (var i = 0; i < sets; i++) {
    var temp = [];
    for (var j = 0; j < cols; j++) {
        var num = Math.floor(Math.random() * max);
        temp.push(num);
    }
    setsArr.push(temp);
    delete temp;
}

答案 4 :(得分:0)

var generate    = document.getElementById("generate");
generate.onclick = gen;

function gen() {
var cols = document.getElementById("cols").value;

var sets = document.getElementById("sets").value;
var max = document.getElementById("max").value;

var setsArr = new Array();

for (var i = 0; i < sets; i++) {
    setsArr[i] = new Array(); 
    for (var j = 0; j < cols; j++) {
        var num = Math.floor(Math.random() * max);
        setsArr[i][j]=num;
    }
}
console.log(setsArr);
}

现在它的工作正常我更新了你的小提琴