web-dev-qa-db-ja.com

JavaScriptで単純な配列を2次元配列(マトリックス)に変換する方法

私が配列を持っていると想像してください:

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

そして、私はそれを例えば次のように2次元配列(N x Mの行列)に変換したいと思います。

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

マトリックスの行と列は変更可能であることに注意してください。

35
Bakhtiyor

このようなもの?

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

使用法:

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

Array.prototype.reduce関数は、これを1行で実行します。

ECMAScript 6スタイル:

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

「通常の」JavaScript:

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

3を列数をいくつでも変更できますが、再利用可能な関数に追加することもできます。

ECMAScript 6スタイル:

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

「通常の」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;
  }, []);
}
30
samanime

このコードは、サイズと配列を気にする必要がない一般的なものであり、普遍的に機能します

  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. 空の配列を定義しています。
  2. サイズに従って繰り返し、指定されたチャンクを取得します。サイズが2,3,4,5,6になる可能性があるため、isizeでインクリメントするのはそのためです。 ....
  3. ここでは、最初にiから(i + size)にスライスしてから、空の配列resにプッシュしています。
  4. 2次元配列を返します。
8

次のようなものはどうですか:

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/

3
Andrew Whitaker

2つのforループを使用するだけです。

var rowNum = 3;
var colNum = 3;
var k = 0;
var dest = new Array(rowNum);

for (i=0; i<rowNum; ++i) {
  var tmp = new Array(colNum);
  for (j=0; j<colNum; ++j) {
    tmp[j] = src[k];
    k++;
  }
  dest[i] = tmp;
}
2
function matrixify( source, count )
{
    var matrixified = [];
    var tmp;
    // iterate through the source array
    for( var i = 0; i < source.length; i++ )
    {
        // use modulous to make sure you have the correct length.
        if( i % count == 0 )
        {
            // if tmp exists, Push it to the return array
            if( tmp && tmp.length ) matrixified.Push(tmp);
            // reset the temporary array
            tmp = [];
        }
        // add the current source value to the temp array.
        tmp.Push(source[i])
    }
    // return the result
    return matrixified;
}

実際に配列の内部値を置き換えたい場合は、次のように呼び出すことができると思います。

source.splice(0, source.length, matrixify(source,3));
2
cwallenpoole

これは、特に生成された配列項目を操作したい場合に、配列を2次元配列に変換する簡単な方法です。

const arr = [1,2,3,4,5,6,7,8,9]
let i = 0;
let twoDimension = [];
while (i < arr.length) {
  const first = arr[i];
  const second = arr[i + 1];
  const third = arr[i + 2]
  let tempArr = []

  if (first && second && third) {
    tempArr.Push(first, second, third)
  } else if (first && second) {
    tempArr.Push(first, second)
  } else {
    tempArr.Push(first)
  }

  twoDimension[twoDimension.length] = tempArr;
  i += 3;
 }
 console.log(twoDimension)
1
p8ul
function chunkArrToMultiDimArr(arr, size) {

    var newArray = [];

    while(arr.length > 0)
    {
      newArray.Push(arr.slice(0, size));
      arr = arr.slice(size);
    }

  return newArray;
}

//example - call function
chunkArrToMultiDimArr(["a", "b", "c", "d"], 2);
1
SayedRakib

私がこれを偶然見つけたときに私が思いつくことができる最もクリーンな方法は次のとおりです:

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

使用法は次のようなものになります

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

const result = arrayToMatrix(things, 2)

結果がどこにあるか

[
  ['item 1', 'item 2'],
  ['item 1', 'item 2'],
  ['item 1', 'item 2']
]
1
function matrixify(array, n, m) {
    var result = [];
    for (var i = 0; i < n; i++) {
        result[i] = array.splice(0, m);
    }
    return result;
}
a = matrixify(a, 3, 3);
1
Jannic Beck

短い答えの使用:

const gridArray=(a,b)=>{const d=[];return a.forEach((e,f)=>{const 
h=Math.floor(f/b);d[h]=d[h]||[],d[h][f%b]=a[f]}),d};

どこ:

a: is the array
b: is the number of columns

あなたが記事を読むことができる長い答え:

長さ「n」の配列を配列グリッドに変換する方法

0
Mustafa Dwekat

素晴らしいリポジトリ ここ

  • api:masfufa.js

  • サンプル:masfufa.html

そのサンプルによると、次のスニペットは問題を解決します:

  jsdk.getAPI('my');
  var A=[1, 2, 3, 4, 5, 6, 7, 8, 9];
  var MX=myAPI.getInstance('masfufa',{data:A,dim:'3x3'});

次に:

MX.get[0][0]  // -> 1 (first)
MX.get[2][2] //  ->9 (last)
0
Abdennour TOUMI

ES6でArray.from()を使用する最も簡単な方法

const matrixify = (arr, size) => 
Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>  
arr.slice(i * size, i * size + size));
const list =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] ;
console.log(matrixify(list, 3));
0
Jayesh Vachhani
function changeDimension(arr, size) {  
  var arrLen = arr.length;
  var newArr = [];
  var count=0;
  var tempArr = [];

  for(var i=0; i<arrLen; i++) {
    count++;
    tempArr.Push(arr[i]);

    if (count == size || i == arrLen-1) {
      newArr.Push(tempArr);
      tempArr = [];
      count = 0;
    }    
  }  
  return newArr;
}

changeDimension([0, 1, 2, 3, 4, 5], 4);
0
Sagar Mishra