web-dev-qa-db-fra.com

push () un tableau à deux dimensions

J'essaie de passer à un tableau à deux dimensions sans le gâcher. Mon tableau est actuellement:

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

Et mon code que j'essaye est:

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

Cela devrait aboutir à ce qui suit:

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

Mais ce n'est pas le cas et je ne suis pas sûr que ce soit la bonne façon de le faire ou non.

La question est donc: comment pourrais-je accomplir cela?

27
Jo3la

Vous avez des erreurs dans votre code:

  1. Utilisez myArray[i].Push( 0 ); pour ajouter une nouvelle colonne. Votre code (myArray[i][j].Push(0);) fonctionnerait dans un tableau à 3 dimensions, car il essaye d'ajouter un autre élément à un tableau à la position [i][j].
  2. Vous ne développez que (col-d) - beaucoup de colonnes dans toutes les lignes, même dans celles qui n'ont pas encore été initialisées et n'ont donc aucune entrée jusqu'à présent.

Une version correcte, bien que de nature verbeuse, serait la suivante:

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

Itérer sur deux dimensions signifie que vous devrez vérifier deux dimensions.

en supposant que vous commenciez avec:

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

Vous souhaitez développer ce tableau à deux dimensions pour devenir:

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

Ce qui signifie que vous devez comprendre quelle est la différence.

Commencez avec le tableau extérieur:

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

Si vous voulez agrandir ce tableau, vous devez vérifier que sa longueur est correcte et ajouter plus de tableaux intérieurs pour compenser la différence:

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([]);
    }
}

L'étape suivante nécessite une itération sur chaque colonne de chaque tableau. Nous allons construire sur le code d'origine:

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
zzzzBov

Vous devez parcourir toutes les lignes et ajouter les lignes et les colonnes manquantes. Pour les lignes déjà existantes, vous passez en boucle de c en colonnes, pour les nouvelles lignes, commencez par placer un tableau vide dans un tableau extérieur, puis en boucle de 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
Guffa

Dans votre cas, vous pouvez le faire sans utiliser 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;    
}
3
ZER0
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
Daniel

Créez un tableau et placez-le dans le premier. Dans ce cas, je récupère les données de la réponse 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
CelzioBR

vous appelez le Push () sur un élément de tableau (int), où Push () doit être appelé sur le tableau; manipuler/remplir le tableau de cette façon n'a aucun sens, vous pouvez le faire comme ceci

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

vous pouvez également combiner les deux boucles en utilisant une condition if, if row <r, sinon if row> = r

0
Moataz Elmasry