【问题标题】:How do I create a jagged array that produces a random amount arrays inside an array with random values?如何创建一个锯齿状数组,该数组在具有随机值的数组内生成随机数量的数组?
【发布时间】:2015-05-04 21:57:37
【问题描述】:
var array = [];
var list = "<ul>";
for(var i = 0; i < parseInt(Math.random() * 20); i++){
array[i] = [parseInt(Math.random() * 10)];
list += "<li>" + array[i];
for(var j = 0; j < array[i].length; j++){
array[i][j] += parseInt(Math.random() * 10);
list += " " + array[i][j];
}
list += "</li>"
}
list += "</ul>"
document.getElementById("print").innerHTML += list;
<div id="print">
</div>
我的目标是创建一个锯齿状数组。
我想初始化一个数组并在包含随机数的初始数组内创建随机数组集。
我正在寻找的输出是这样的:
- 4 2 5
- 1 10 3 4 5 6
- 7 1 4 8
- 6 9
- 1
- 4 6 7
..但是当我运行代码时,我每次运行程序时只收到两列随机整数。我该如何解决这个问题?
【问题讨论】:
标签:
javascript
arrays
html
multidimensional-array
jagged-arrays
【解决方案1】:
我认为您遇到了麻烦,因为您在 for 循环的每次迭代中都重新计算了一个随机值。
这更容易。我注意到的一件事是你的代码做的太多了。它正在创建随机数组,创建随机数组的随机数组,创建 HTML,连接 HTML 的字符串,以及改变 DOM。一个概念性功能要做的事情很多。如何将逻辑分解为单一职责功能并将它们组合在一起:
function randomValue(offset) {
return Math.floor(Math.random() * (offset || 10));
}
function randomArray(size, valueFn) {
var i, arr = [];
size = randomValue(size || 20) + 1;
for (i = 0; i < size; i++) {
arr.push(valueFn());
}
return arr;
}
function randomJaggedArray(size, offset) {
return randomArray(size, function() {
return randomArray(size, function() {
return randomValue(offset);
});
});
}
function toHTML(arr) {
var html = '<ul>';
html += arr.map(function(value) {
var li = '<li>';
if (typeof value === 'number') {
li += '' + value;
} else {
li += value.join(' ');
}
li += '</li>';
return li;
}).join('');
html += '</ul>';
return html;
}
document.getElementById('print').innerHTML = toHTML(randomJaggedArray(20, 10));
<div id="print"></div>
【解决方案2】:
此代码应生成您要查找的数组类型。
function createRandomArray(){
//Create empty Array
var out=[];
//random element count for outer array
var outerLength=parseInt(Math.random()*20)+1;
//fill outer array with random arrays
for(var i=0;i<outerLength;i++){
//inner element count and initialisation
var innerLength=parseInt(Math.random()*10)+1;
var inner=[];
for(var j=0;j<innerLength;j++){
//fill the inner array with random numbers
inner.push(parseInt(Math.random()*10)+1);
}
//add the inner array to the outer array
out.push(inner);
}
return out;
}
编辑
我会尝试解释为什么你的代码不起作用
for(var i = 0; i < parseInt(Math.random() * 20); i++){
在每次循环迭代中,Math.random 部分都会再次执行。您应该将其保存在一个额外的变量中。
array[i] = [parseInt(Math.random() * 10)];
你用一个随机数初始化子数组
for(var j = 0; j < array[i].length; j++){
然后遍历这个子数组(它只有一个元素)。所以这个循环每个子数组只调用一次。因此,每个 Array 恰好有 2 个元素
【解决方案3】:
当你这样做时:
array[i] = [parseInt(Math.random() * 10)];
array[0] 被分配了一个长度为 1 并包含一个数字整数的数组,假设它是 5,因此 array 看起来像 [[5]]。后来:
for(var j = 0; j < array[i].length; j++){
注意这里array[i].length是1。
array[i][j] += parseInt(Math.random() * 10);
所以这会在 array[0][0] 的值上添加一个数字,原来是 5,现在可能是 8,所以你有一个像这样的数组:
[[8]]
由于array的长度仍然只有1,而j也自增为1,循环结束。
请注意,如果您使用:
array[i][j].push(parseInt(Math.random() * 10));
您将有一个无限循环,因为您将以增加 j 的相同速率增加数组的长度,并且它将始终为 j + 1。您需要将 j 设置为静态值,例如
for (var j=0, jLimt = parseInt(Math.random()*10); j<jLimt; j++)