循环中的数组

3
创建一个小应用程序来生成随机数。查看这里的演示:这里
在生成数字的函数中存在一个问题,有三个变量控制输出。一组/序列中数字的计数,集合的数量,和限制生成的数字的最大值。
我创建了两个循环来生成集合中的数字。内循环创建数字集合(一个数组),外循环将该集合添加到另一个数组setArr中。
所以我创建了两个数组。一个保存当前生成的集合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);
}

有什么问题吗?乍一看,似乎应该在外部循环中声明temp,而不是在两个循环之外声明。 - Chris Laplante
5个回答

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

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
}

0
问题出在这一行:
temp.length = 0;

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

他说他想要“清空临时数组”。为什么他不能这样做? - Bergi
他想要的是将 temp 设置为一个新的空数组 (temp = []),而不是清空他刚刚 pushsetsArr 中的数组,这是代码当前正在执行的操作。 - mbcrute

0

演示

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

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

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

现在它正常工作了,我更新了你的fiddle。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接