【问题标题】: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));
    &lt;div id="print"&gt;&lt;/div&gt;

    【讨论】:

      【解决方案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 &lt; parseInt(Math.random() * 20); i++){

      在每次循环迭代中,Math.random 部分都会再次执行。您应该将其保存在一个额外的变量中。

      array[i] = [parseInt(Math.random() * 10)];

      你用一个随机数初始化子数组

      for(var j = 0; j &lt; 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++)
        

        【讨论】:

          猜你喜欢
          • 2011-08-15
          • 2013-01-03
          • 2018-04-16
          • 1970-01-01
          • 2021-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-23
          相关资源
          最近更新 更多