Puis-je avoir des conseils sur la façon d'extraire plusieurs colonnes d'un tableau à deux dimensions comme ci-dessous à l'aide de JavaScript?

Array = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12],
];

Les méthodes simples que j'ai vues jusqu'à présent en utilisant forEach ou map permettront l'extraction d'une colonne à la fois, y a-t-il un moyen de l'imbriquer d'une manière ou d'une autre pour extraire l'index de colonne souhaité?

Disons que la colonne de sortie désir est 1, 2 et 4.

Output = [
  [1, 2, 4],
  [5, 6, 8],
  [9,10,12],
];

MODIFIER:

Un autre problème que je dois résoudre est de savoir comment supprimer une ligne si c'est Array [i] [1] = 0 ou vide.

Disons que nous avons des éléments de tableau supplémentaires ...

Array = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12],
  [13,0,15,16],
  [17, ,19,20],
  [21,22,23,24],
]; 

La sortie souhaitée est maintenant ...

Output = [
  [1, 2, 4],
  [5, 6, 8],
  [9,10,12],
  [21,22,24],
]; 
0
user1488934 24 août 2020 à 15:43

2 réponses

Meilleure réponse

Vous pouvez .map() chaque ligne de arr vers un nouveau tableau que vous pouvez obtenir en utilisant un .map() interne sur un tableau de colonnes / index que vous souhaitez obtenir. La carte interne mappera chaque index à sa valeur associée à partir de la ligne, vous donnant les valeurs de chaque colonne pour chaque ligne.

Voir l'exemple ci-dessous:

const arr = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12],
];

const cols = [1, 2, 4];
const res = arr.map(r => cols.map(i => r[i-1]));
console.log(res);

Plus de détails: Comme vous l'avez mentionné, la première carte expose chaque tableau interne à l'intérieur de arr à la fonction de mappage interne:

cols.map(i => r[i-1])

Cette fonction de mappage parcourra les index définis à l'intérieur de cols et les transformera en une nouvelle valeur. Par exemple, disons que r est le deuxième tableau:

[5, 6, 7, 8]

L'exécution de cols.map(...) bouclera sur chaque élément (désigné par i dans la fonction de rappel) dans [1, 2, 4]. Pour chaque élément, nous le «transformons» en un nouvel élément:

i = 1
r = [5, 6, 7, 8]
new value: r[1-1] = 5

Prochaine itération, nous examinons la valeur suivante dans cols:

i = 2
r = [5, 6, 7, 8]
new value: r[2-1] = 6

Enfin, nous regardons la valeur finale dans cols:

i = 4
r = [5, 6, 7, 8]
new value: r[4-1] = 8

Ainsi, la fonction de mappage produit un nouveau tableau qui transforme les valeurs de cols [1, 2, 4], en valeurs à ces index de la ligne courante pour être [5, 6, 8]. Cela se produit pour chaque tableau / ligne interne, produisant le résultat final.


MODIFIER Selon votre modification, vous pouvez appliquer la même logique ci-dessus pour obtenir vos tableaux avec uniquement les colonnes que vous désirez. Une fois que vous avez fait cela, vous pouvez utiliser {{X0} } pour ne conserver que les lignes contenant un truey valeur dans la deuxième colonne. Conserver tous les tableaux avec des valeurs de vérité dans la deuxième colonne supprimera les tableaux avec des valeurs de non-vérité dans la deuxième colonne (falsy) de votre tableau résultant. 0 et undefined sont tous les deux des valeurs flasy, donc elles ne sont pas conservées.

Voir l'exemple ci-dessous:

const arr = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12],
  [13,0,15,16],
  [17, ,19,20],
  [21,22,23,24],
]

const cols = [1, 2, 4];
const col = 2;
const res = arr.filter(r => r[col-1]).map(r => cols.map(i => r[i-1]));
console.log(res);

Si vous souhaitez ignorer plusieurs colonnes, vous pouvez utiliser .every() pour vous assurer que chaque colonne (c'est-à-dire: chaque) contient une valeur de vérité. S'ils le font tous, alors .every() retournera true, en conservant la colonne, sinon, il retournera false, en supprimant la colonne:

const arr = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12],
  [13,0,15,16],
  [ ,17,19,20],
  [21,22,23,24],
]

const cols = [1, 2, 4];
const col = [1, 2];
const res = arr.filter(r => col.every(c => r[c-1])).map(r => cols.map(i => r[i-1]));
console.log(res);
2
Nick Parsons 8 oct. 2020 à 04:03

Vous pouvez l'aborder de la manière ci-dessous. La solution utilise le paramètre d'index disponible dans la méthode de filtrage.

Array.filter (currElem, index, tableau)

Puisque le tableau est indexé à 0, j'ai donc créé le tableau avec l'index que vous voulez dans les données comme [0,1,3]. Vous devez transmettre le tableau de données et le tableau d'index à la fonction.

var array = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12],
];

var arrIndex = [0,1,3];

function extractData(arr,indexArr) {

  return arr.map(obj => {  
      return obj.filter((ob,index) => {
          if(indexArr.includes(index)){return ob}
      })
  })
}

console.log(extractData(array,arrIndex));
1
Harmandeep Singh Kalsi 24 août 2020 à 12:59