【问题标题】:push() a two-dimensional arraypush() 一个二维数组
【发布时间】:2012-07-05 22:52:53
【问题描述】:

我正在尝试推送到一个二维数组而不会弄乱,目前我的数组是:

var myArray = [
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1]
]

我正在尝试的代码是:

var r = 3; //start from rows 3
var c = 5; //start from col 5

var rows = 8;
var cols = 7;

for (var i = r; i < rows; i++)
{
    for (var j = c; j < cols; j++)
    {
        myArray[i][j].push(0);
    }
}

这应该会导致以下结果:

var myArray = [
[1,1,1,1,1,0,0],
[1,1,1,1,1,0,0],
[1,1,1,1,1,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
]

但它并不确定这是否是正确的做法。

所以问题是我将如何实现这一点?

【问题讨论】:

    标签: javascript arrays for-loop multidimensional-array push


    【解决方案1】:

    您的代码中有一些错误:

    1. 使用myArray[i].push( 0 ); 添加新列。您的代码 (myArray[i][j].push(0);) 将在 3 维数组中工作,因为它试图将另一个元素添加到位置为 [i][j] 的数组中。
    2. 您只能在所有行中展开 (col-d)-许多列,即使在那些尚未初始化因此到目前为止还没有条目的行中也是如此。

    一个正确的版本,虽然有点冗长,但如下:

    var r = 3; //start from rows 3
    
    var rows = 8;
    var cols = 7;
    
    // expand to have the correct amount or rows
    for( var i=r; i<rows; i++ ) {
      myArray.push( [] );
    }
    
    // expand all rows to have the correct amount of cols
    for (var i = 0; i < rows; i++)
    {
        for (var j =  myArray[i].length; j < cols; j++)
        {
            myArray[i].push(0);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您必须遍历所有行,并添加缺少的行和列。对于已经存在的行,你从 c 循环到 cols,对于新行,首先将一个空数组推送到外部数组,然后从 0 循环到 cols:

      var r = 3; //start from rows 3
      var c = 5; //start from col 5
      
      var rows = 8;
      var cols = 7;
      
      for (var i = 0; i < rows; i++) {
        var start;
        if (i < r) {
          start =  c;
        } else {
          start = 0;
          myArray.push([]);
        }
        for (var j = start; j < cols; j++) {
              myArray[i].push(0);
          }
      }
      

      【讨论】:

        【解决方案3】:

        迭代二维意味着您需要检查二维。

        假设您开始:

        var myArray = [
            [1,1,1,1,1],
            [1,1,1,1,1],
            [1,1,1,1,1]
        ]; //don't forget your semi-colons
        

        你想把这个二维数组展开成:

        var myArray = [
            [1,1,1,1,1,0,0],
            [1,1,1,1,1,0,0],
            [1,1,1,1,1,0,0],
            [0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0],
            [0,0,0,0,0,0,0],
        ];
        

        这意味着您需要了解其中的区别。

        从外部数组开始:

        var myArray = [
            [...],
            [...],
            [...]
        ];
        

        如果你想让这个数组更长,你需要检查它的长度是否正确,并添加更多的内部数组来弥补差异:

        var i,
            rows,
            myArray;
        rows = 8;
        myArray = [...]; //see first example above
        for (i = 0; i < rows; i += 1) {
            //check if the index exists in the outer array
            if (!(i in myArray)) {
                //if it doesn't exist, we need another array to fill
                myArray.push([]);
            }
        }
        

        下一步需要遍历每个数组中的每一列,我们将在原始代码的基础上进行构建:

        var i,
            j,
            row,
            rows,
            cols,
            myArray;
        rows = 8;
        cols = 7; //adding columns in this time
        myArray = [...]; //see first example above
        for (i = 0; i < rows; i += 1) {
            //check if the index exists in the outer array (row)
            if (!(i in myArray)) {
                //if it doesn't exist, we need another array to fill
                myArray[i] = [];
            }
            row = myArray[i];
            for (j = 0; j < cols; j += 1) {
                //check if the index exists in the inner array (column)
                if (!(i in row)) {
                    //if it doesn't exist, we need to fill it with `0`
                    row[j] = 0;
                }
            }
        }
        

        【讨论】:

          【解决方案4】:

          在您的情况下,您可以完全不使用 push 来做到这一点:

          var myArray = [
              [1,1,1,1,1],
              [1,1,1,1,1],
              [1,1,1,1,1]
          ]
          
          var newRows = 8;
          var newCols = 7;
          
          var item;
          
          for (var i = 0; i < newRows; i++) {
              item = myArray[i] || (myArray[i] = []);
          
              for (var k = item.length; k < newCols; k++)
                  item[k] = 0;    
          }
          

          【讨论】:

          • 谢谢非常有用,是否可以删除添加的行?也许我可以使用上面相同的方法,而是使用 splice 所以 item[k].splice(k, 1) 删除添加的行/列
          • 因为添加的行是追加的,所以可以使用length删除:myArray.length = 3;使最后一个 5 被丢弃(假设您有 8 行)。
          • 啊哈哈,没想到.length 是可能的,现在可以工作了...谢谢。
          • length 是在不创建新实例的情况下清除数组的好方法,因此如果其他对象指向同一个数组,您是安全的。
          【解决方案5】:
          var r = 3; //start from rows 3
          var c = 5; //start from col 5
          
          var rows = 8;
          
          var cols = 7;
          
          
          for (var i = 0; i < rows; i++)
          
          {
          
           for (var j = 0; j < cols; j++)
          
           {
              if(j <= c && i <= r) {
                myArray[i][j] = 1;
              } else {
                myArray[i][j] = 0;
              }
          }
          
          }
          

          【讨论】:

          • (1) 你有一个语法错误:在else 之前缺少{。 (2) 如果有要添加的行,此代码将不起作用:ReferenceError: myArray is not defined.
          • 是的,添加 {。有一个参考错误,因为我猜这是一段内联代码,并且数组已经存在,因为它们应该存在,关于上面的 sn-p。
          【解决方案6】:

          您在数组元素 (int) 上调用 push(),应该在数组上调用 push(),同样以这种方式处理/填充数组没有任何意义 你可以这样做

          for (var i = 0; i < rows - 1; i++)
          {
            for (var j = c; j < cols; j++)
            {
              myArray[i].push(0);
            }
          }
          
          
          for (var i = r; i < rows - 1; i++)
          {
          
            for (var j = 0; j < cols; j++)
            {
                col.push(0);
            }
          }
          

          您还可以使用 if 条件组合两个循环,如果 row = r

          【讨论】:

            【解决方案7】:

            创建一个数组并放入第一个数组,在这种情况下我从 JSON 响应中获取数据

            $.getJSON('/Tool/GetAllActiviesStatus/',
               var dataFC = new Array();
               function (data) {
                  for (var i = 0; i < data.Result.length; i++) {
                      var serie = new Array(data.Result[i].FUNCAO, data.Result[i].QT, true, true);
                      dataFC.push(serie);
                   });
            

            【讨论】:

              【解决方案8】:

              下面的解决方案使用双循环将数据添加到案例 3 中的 2x2 数组的底部。内部循环将选定元素的值推送到新的行数组中。然后外循环将新的行数组推到现有数组的底部(请参阅Newbie: Add values to two-dimensional array with for loops, Google Apps Script)。

              在此示例中,我创建了一个从现有数组中提取部分的函数。提取的部分可以是现有数组的行(全部或部分)、列(全部或部分)或 2x2 部分。通过将现有数组 (arr) 中的相关部分推送到新数组中来填充新的空白数组 (newArr)。

               function arraySection(arr, r1, c1, rLength, cLength) {      
                 rowMax = arr.length;
                  if(isNaN(rowMax)){rowMax = 1};
                 colMax = arr[0].length;
                 if(isNaN(colMax)){colMax = 1};
                 var r2 = r1 + rLength - 1;
                 var c2 = c1 + cLength - 1;
              
                 if ((r1< 0 || r1 > r2 || r1 > rowMax || (r1 | 0) != r1) || (r2 < 0 || 
                   r2 > rowMax || (r2 | 0) != r2)|| (c1< 0 || c1 > c2 || c1 > colMax || 
                 (c1 | 0) != c1) ||(c2 < 0 || c2 > colMax || (c2 | 0) != c2)){
                      throw new Error(
                      'arraySection: invalid input')       
                      return;
                   };
                 var newArr = [];
              
              // Case 1: extracted section is a column array, 
              //          all elements are in the same column
               if (c1 == c2){
                 for (var i = r1; i <= r2; i++){ 
                       // Logger.log("arr[i][c1] for i = " + i);
                       // Logger.log(arr[i][c1]);
                   newArr.push([arr[i][c1]]); 
                   };
                  };  
              
              // Case 2: extracted section is a row array, 
              //          all elements are in the same row
                if (r1 == r2 && c1 != c2){
                  for (var j = c1; j <= c2; j++){ 
                    newArr.push(arr[r1][j]); 
                    };
                 };  
              
              // Case 3: extracted section is a 2x2 section 
                  if (r1 != r2 && c1 != c2){     
                   for (var i = r1; i <= r2; i++) {
                        rowi = [];
                     for (var j = c1; j <= c2; j++) {
                        rowi.push(arr[i][j]);
                      }
                     newArr.push(rowi)
                    };
                  };
                 return(newArr);
                };
              

              【讨论】:

                【解决方案9】:

                你也可以这样试试。

                var r = 3; //start from rows 3
                var c = 5; //start from col 5
                
                var rows = 8;
                var cols = 7;
                
                for (var i = r; i < rows; i++)
                {
                    for (var j = c; j < cols; j++)
                    {
                        myArray.push([var[i],var[j])
                    }
                }
                

                这将为您创建一个二维数组。

                【讨论】:

                  猜你喜欢
                  • 2021-03-24
                  • 1970-01-01
                  • 2021-06-04
                  • 2022-12-07
                  • 1970-01-01
                  • 2017-10-12
                  • 2021-12-31
                  • 2012-04-10
                  相关资源
                  最近更新 更多