开发者问题收集

循环中的阵列

2014-03-24
103

创建一个小型应用程序来生成随机数。请参阅 此处 中的小提琴。

生成数字的函数存在问题。有 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);
}
3个回答

当您将 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);
}
Bergi
2014-03-24

jsFiddle 演示

将数组长度设置为 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
}
Travis J
2014-03-24

问题出在这行:

temp.length = 0;

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

mbcrute
2014-03-24