Вопрос по push, multidimensional-array, for-loop, arrays, javascript – push () двумерный массив

24

Я пытаюсь переместить двумерный массив, чтобы он не испортился, в настоящее время мой массив:

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

Но он не уверен и не уверен, является ли это правильным способом сделать это или нет.

Итак, вопрос в том, как бы я это сделал?

Какиеdoes это делать? Richard JP Le Guen

Ваш Ответ

7   ответов
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;
    }
}

}
да добавь {. Существует ошибка ссылки, потому что я предполагаю, что это фрагмент встроенного кода, и массивы уже существуют, как они должны, относительно приведенного выше фрагмента.
Код, который вы дали, неправильный, я думаю. пожалуйста, проверьте
(1) у вас есть синтаксическая ошибка: отсутствует{ доelse, (2) Этот код не будет работать, если есть строки, которые нужно добавить:ReferenceError: myArray is not defined.
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;
        }
    }
}
3

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;    
}
Ах, я не думал, что это возможно с длиной, теперь это работает ... спасибо. Jo3la
Поскольку добавленная строка добавлена, вы можете использоватьlength чтобы удалить их:myArray.length = 3; делает последний5 быть сброшенным (предполагается, что у вас есть8 строки).
length хороший способ очистить массив без создания нового экземпляра, поэтому, если другие объекты указывают на тот же массив, вы в безопасности.
Спасибо, очень полезно, можно ли удалить добавленные строки? Может быть, я могу использовать тот же метод выше, но вместо того, чтобы склеить, так что item [k] .splice (k, 1), чтобы удалить добавленные строки / столбцы Jo3la
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);
       });
4

лбцы. Для уже существующих строк вы циклически переходите от c к столбцам, для новых строк сначала помещаете пустой массив во внешний массив, затем цикл от 0 до столбцов:

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

Use myArray[i].push( 0 ); to add a new column. Your code (myArray[i][j].push(0);) would work in a 3-dimensional array as it tries to add another element to an array at position [i][j]. You only expand (col-d)-many columns in all rows, even in those, which haven't been initialized yet and thus have no entries so far.

Одна правильная, хотя и многословная версия, будет следующей:

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);
    }
}
О, я вижу, как это работает сейчас, спасибо. Jo3la
0

где 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, если строка & lt; r, иначе, если строка & gt; = r

Код, который вы дали, неправильный, я думаю. пожалуйста, проверьте

Похожие вопросы