如何创建一个锯齿状数组,在具有随机值的数组中生成随机数量的数组?

时间:2015-03-04 02:08:45

标签: javascript arrays html5 multidimensional-array jagged-arrays



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;
&#13;
<div id="print">
</div>
&#13;
&#13;
&#13;

我的目标是创建一个锯齿状阵列。

我想初始化一个数组,并在包含随机数的初始数组中创建随机数组。

我正在寻找的输出是这样的:

  • 4 2 5
  • 1 10 3 4 5 6
  • 7 1 4 8
  • 6 9
  • 1
  • 4 6 7

..但是当我运行代码时,到目前为止,每次运行程序时,我只会收到两列随机整数。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

此代码应生成您要查找的数组类型。

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个元素

答案 1 :(得分:0)

当你这样做时:

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

答案 2 :(得分:0)

我认为你遇到了麻烦,因为你在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>