私が配列を持っていると想像してください:
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));
マトリックスの行と列は変更可能であることに注意してください。
このようなもの?
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]]
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;
}, []);
}
このコードは、サイズと配列を気にする必要がない一般的なものであり、普遍的に機能します
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;
}
次のようなものはどうですか:
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);
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;
}
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次元配列に変換する簡単な方法です。
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)
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);
私がこれを偶然見つけたときに私が思いつくことができる最もクリーンな方法は次のとおりです:
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']
]
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);
短い答えの使用:
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
あなたが記事を読むことができる長い答え:
素晴らしいリポジトリ ここ 。
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)
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));
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);