push() 一个二维数组

IT技术 javascript arrays for-loop multidimensional-array push
2021-03-06 06:28:07

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

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

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

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

6个回答

您的代码中有一些错误:

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

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

遍历两个维度意味着您需要检查两个维度。

假设你从:

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

在您的情况下,您可以完全不使用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;    
}
因为添加的行是追加的,所以可以使用length删除它们:myArray.length = 3; 使最后一个5被丢弃(假设您有8行)。
2021-04-17 06:28:07
length 是在不创建新实例的情况下清除数组的好方法,因此如果其他对象指向同一个数组,则您是安全的。
2021-04-21 06:28:07
谢谢 非常有用,是否可以删除添加的行?也许我可以使用上面相同的方法,而是使用 splice so item[k].splice(k, 1) 删除添加的行/列
2021-04-29 06:28:07
啊哈不认为 .length 是可能的,现在开始工作了......谢谢。
2021-05-08 06:28:07
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;
    }
}

}
是的,添加{。有一个参考错误,因为我猜这是一段内联代码,并且数组已经存在,关于上面的片段。
2021-04-19 06:28:07
(1) 你有一个语法错误:missing {before else. (2) 如果要添加行,此代码将不起作用:ReferenceError: myArray is not defined.
2021-05-12 06:28:07