38 votes

Convertir un tableau simple en tableau bidimensionnel (matrice)

Imaginez que j'ai un tableau :

A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9);

Et je veux qu'il soit converti en tableau à 2 dimensions (matrice de N x M), par exemple comme ceci :

A = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9));

Notez que les lignes et les colonnes de la matrice sont modifiables.

61voto

elusive Points 14184

Quelque chose comme ça ?

function listToMatrix(list, elementsPerSubArray) {
    var matrix = [], i, k;

    for (i = 0, k = -1; i < list.length; i++) {
        if (i % elementsPerSubArray === 0) {
            k++;
            matrix[k] = [];
        }

        matrix[k].push(list[i]);
    }

    return matrix;
}

Utilisation :

var matrix = listToMatrix([1, 2, 3, 4, 4, 5, 6, 7, 8, 9], 3);
// result: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

34voto

samanime Points 13967

Vous pouvez utiliser le Array.prototype.reduce pour faire cela en une seule ligne.

Style ECMAScript 6 :

myArr.reduce((rows, key, index) => (index % 3 == 0 ? rows.push([key]) 
  : rows[rows.length-1].push(key)) && rows, []);

"Normal" JavaScript :

myArr.reduce(function (rows, key, index) { 
  return (index % 3 == 0 ? rows.push([key]) 
    : rows[rows.length-1].push(key)) && rows;
}, []);

Vous pouvez modifier le chiffre 3 pour qu'il corresponde au nombre de colonnes que vous souhaitez, ou mieux encore, le placer dans une fonction réutilisable :

Style ECMAScript 6 :

const toMatrix = (arr, width) => 
    arr.reduce((rows, key, index) => (index % width == 0 ? rows.push([key]) 
      : rows[rows.length-1].push(key)) && rows, []);

"Normal" JavaScript :

function toMatrix(arr, width) {
  return arr.reduce(function (rows, key, index) { 
    return (index % width == 0 ? rows.push([key]) 
      : rows[rows.length-1].push(key)) && rows;
  }, []);
}

11voto

Ce code est générique, il n'y a pas besoin de s'inquiéter de la taille et du tableau, il fonctionne universellement.

  function TwoDimensional(arr, size) 
    {
      var res = []; 
      for(var i=0;i < arr.length;i = i+size)
      res.push(arr.slice(i,i+size));
      return res;
    }
  1. Définition d'un tableau vide.
  2. Itérer en fonction de la taille afin d'obtenir le morceau spécifié. C'est pourquoi j'incrémente i con taille parce que la taille peut être 2,3,4,5,6......
  3. Ici, je découpe d'abord i a (i+taille) et ensuite je le pousse dans un tableau vide res .
  4. Retourne le tableau à deux dimensions.

3voto

Andrew Whitaker Points 58588

Pourquoi pas quelque chose comme :

var matrixify = function(arr, rows, cols) {
    var matrix = [];
    if (rows * cols === arr.length) {
        for(var i = 0; i < arr.length; i+= cols) {
            matrix.push(arr.slice(i, cols + i));
        }
    }

    return matrix;
};

var a = [0, 1, 2, 3, 4, 5, 6, 7];
matrixify(a, 2, 4);

http://jsfiddle.net/andrewwhitaker/ERAUs/

3voto

Calle Bergström Points 390

La méthode la plus propre que j'ai pu trouver en tombant sur ce problème était la suivante :

const arrayToMatrix = (array, columns) => Array(Math.ceil(array.length / columns)).fill('').reduce((acc, cur, index) => {
  return [...acc, [...array].splice(index * columns, columns)]
}, [])

où l'usage serait quelque chose comme

const things = [
  'item 1', 'item 2',
  'item 1', 'item 2',
  'item 1', 'item 2'
]

const result = arrayToMatrix(things, 2)

où le résultat finit par être

[
  ['item 1', 'item 2'],
  ['item 1', 'item 2'],
  ['item 1', 'item 2']
]

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