push()一个二维数组

35

我试图往一个二维数组中添加元素,但是目前我的数组是这样的:

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],
]

但是它没有实现,我不确定这是否是正确的方法。

所以问题是我该如何实现?

10个回答

47
你的代码存在一些错误:
  1. 使用myArray[i].push( 0 );来添加新列。你的代码(myArray[i][j].push(0);)只适用于三维数组,因为它尝试向位置[i][j]的数组中添加另一个元素。
  2. 你只扩展了(列数-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);
    }
}

5
在你的情况下,你可以完全不使用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;    
}

1
非常感谢,是否可以删除添加的行?也许我可以使用上面相同的方法,但是改用splice函数,例如item[k].splice(k, 1)来删除添加的行/列。 - Jo3la
1
由于添加的行是追加的,因此您可以使用 length 将它们删除:myArray.length = 3; 这将使最后一个 5 被丢弃(假设您有 8 行)。 - ZER0
1
啊哈,没想到用 .length 也可以实现,现在已经搞定了...谢谢。 - Jo3la
1
“length”是一个很好的方法,可以清除数组而不创建新实例,因此如果其他对象指向相同的数组,则安全。 - ZER0

4

您需要遍历所有行,并添加缺失的行和列。对于已经存在的行,您需要从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);
    }
}

4

在两个维度上进行迭代意味着你需要检查这两个维度。

假设你从以下内容开始:

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

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

}

2
(1) 你有一个语法错误:在else之前缺少{。 (2) 如果要添加行,则此代码将无法工作:ReferenceError: myArray未定义 - Sirko
1
是的,在 { 处添加。由于我猜这是一小段内联代码,而且数组已经按照上面的片段存在,所以会出现引用错误。 - Daniel

0
创建一个数组并将第一个数据放入其中,在这种情况下,我从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);
       });

0

你也可以尝试这样做。

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

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


0
<script>
    let test = new Array;
    for(let i = 1; i < 10; i++){
        test[i] = new Array;
        
        test[i]['type']     = 'test-type'+i;
        test[i]['content']  = 'test-content'+i;
    }
    console.log(test);
</script>

1
你的回答可以通过添加更多关于代码的信息以及它如何帮助提问者来改进。 - Tyler2P

0
下面的解决方案使用双重循环来在Case 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);
  };

0

你正在对一个数组元素(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 条件语句将这两个循环结合起来,如果行数小于 r,则执行第一个循环,否则执行第二个循环。


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