Push() двумерный массив
Я пытаюсь перейти к двумерному массиву без его запутывания, в настоящее время мой массив:
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],
]
Но он не знает и не уверен, что это правильный способ сделать это или нет.
Итак, вопрос в том, как бы я это сделал?
Ответы
Ответ 1
У вас есть некоторые ошибки в коде:
- Используйте
myArray[i].push( 0 );
, чтобы добавить новый столбец. Ваш код (myArray[i][j].push(0);
) будет работать в трехмерном массиве, поскольку он пытается добавить еще один элемент в массив в позиции [i][j]
.
- Вы только расширяете (col-d) -на многие столбцы во всех строках, даже в тех, которые еще не были инициализированы и, таким образом, не имеют записей.
Одна правильная, хотя и довольно подробная версия, будет следующей:
var r = 3; //start from rows 3
var c = 5; //start from col 5
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;
}
Ответ 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;
}
}
}
Ответ 6
вы вызываете push() в элементе массива (int), где 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, else, если row >= r
Ответ 7
Создайте массив am и добавьте внутри первого, в этом случае я получаю данные из ответа 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);
});