96 votes

Obtenir une colonne d'un tableau à deux dimensions

Comment puis-je récupérer une colonne à partir d'un Tableau à 2 dimensions et pas une seule entrée ? Je fais cela parce que je veux rechercher une chaîne de caractères dans une seule des colonnes. S'il existe un autre moyen d'y parvenir, dites-le moi.

J'utilise le tableau défini de cette façon :

var array=[];

A la fin, la taille de ce tableau est de 20(col)x3(lignes) et je dois lire la première ligne et vérifier l'existence d'une phrase dans celle-ci.

10voto

Brian Berneker Points 175

Version ES6 en Javascript :

Utilisation des clés d'objet :

var haystack = [
 {a:1, b:2},
 {a:3, b:4},
 {a:5, b:6}
];

var b_col = haystack.map(x => x.b); // [2,4,6]

Utilisation d'index de tableaux imbriqués :

var haystack2 = [
  [1,2,3,4,5],
  [5,4,3,2,1],
  [9,8,7,6,5],
  [5,6,7,8,9]
];

var col_2 = haystack.map(x => x[2]); // [3,3,7,7]

La réponse de @Pylon est également une bonne façon de l'ajouter au prototype Array.

5voto

MEHNAZ HUSSAIN Points 81
function arrayColumn(arr, n) {
  return arr.map(x=> x[n]);
}

var twoDimensionalArray = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];

console.log(arrayColumn(twoDimensionalArray, 1));

3voto

Doglas Points 315

Cette fonction fonctionne pour les tableaux et les objets. obs : elle fonctionne comme la fonction php array_column. Cela signifie qu'un troisième paramètre optionnel peut être passé pour définir quelle colonne correspondra aux indices de retour.

function array_column(list, column, indice){
    var result;

    if(typeof indice != "undefined"){
        result = {};

        for(key in list)
            result[list[key][indice]] = list[key][column];
    }else{
        result = [];

        for(key in list)
            result.push( list[key][column] );
    }

    return result;
}

Il s'agit d'une version conditionnelle :

function array_column_conditional(list, column, indice){
    var result;

    if(typeof indice != "undefined"){
        result = {};

        for(key in list)
            if(typeof list[key][column] !== 'undefined' && typeof list[key][indice] !== 'undefined')
                result[list[key][indice]] = list[key][column];
    }else{
        result = [];

        for(key in list)
            if(typeof list[key][column] !== 'undefined')
                result.push( list[key][column] );
    }

    return result;
}

la facilité d'utilisation :

var lista = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];

var obj_list = [
  {a: 1, b: 2, c: 3},
  {a: 4, b: 5, c: 6},
  {a: 8, c: 9}
];

var objeto = {
  d: {a: 1, b: 3},
  e: {a: 4, b: 5, c: 6},
  f: {a: 7, b: 8, c: 9}
};

var list_obj = {
  d: [1, 2, 3],
  e: [4, 5],
  f: [7, 8, 9]
};

console.log( "column list: ", array_column(lista, 1) );
console.log( "column obj_list: ", array_column(obj_list, 'b', 'c') );
console.log( "column objeto: ", array_column(objeto, 'c') );
console.log( "column list_obj: ", array_column(list_obj, 0, 0) );

console.log( "column list conditional: ", array_column_conditional(lista, 1) );
console.log( "column obj_list conditional: ", array_column_conditional(obj_list, 'b', 'c') );
console.log( "column objeto conditional: ", array_column_conditional(objeto, 'c') );
console.log( "column list_obj conditional: ", array_column_conditional(list_obj, 0, 0) );

Sortie :

/*
column list:  Array [ 2, 5, 8 ]
column obj_list:  Object { 3: 2, 6: 5, 9: undefined }
column objeto:  Array [ undefined, 6, 9 ]
column list_obj:  Object { 1: 1, 4: 4, 7: 7 }

column list conditional:  Array [ 2, 5, 8 ]
column obj_list conditional:  Object { 3: 2, 6: 5 }
column objeto conditional:  Array [ 6, 9 ]
column list_obj conditional:  Object { 1: 1, 4: 4, 7: 7 }
*/

3voto

Alexandr Points 477

J'ai créé une bibliothèque trancheur de matrice pour manipuler les éléments de la matrice. Votre problème pourrait donc être résolu de la manière suivante :

var m = new Matrix([
    [1, 2],
    [3, 4],
]);

m.getColumn(1); // => [2, 4]

Il est possible que cela soit utile à quelqu'un ;-)

2voto

Pylon Points 348

Tout comme les postes précédents, vous pouvez écrire une fonction pour archiver. Mais nous pourrions ajouter la fonction par-dessus le Array.prototype comme ci-dessous :

Array.prototype.column = function(i) {
  try { 
    return this.map( x => x[i]);
  } catch (e) {
    // catch error: out of index or null array ....
    console.log(e);
  }
}

let array =
[[`animal`,`carnivours`],
 [`cow`,`milk`],
 [`plant`,`small`],
 [`fish`,`tank`]];

console.log(array.column(0))
console.log(array.column(1))

Je pense que c'est définitivement plus élégant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X