Vue.js - How To Convert A Simple Array To Dynamic Nxnxn Matrix
Imagine you have an array: listItems = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13 ,14 ,15 ,16, 17, 18, 19, 20, 21, 22, 23]; And I want it to convert into 3-dimensional Array((Matr
Solution 1:
You can reshape the array using vanilla JS.
constrange = (start, stop) => Array(stop - start).fill(0).map((n, i) => i + start);
constequals = (actual, expected) => JSON.stringify(actual) === JSON.stringify(expected);
const expected = [
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ],
[ [ 10, 11, 12 ], [ 13, 14, 15 ], [ 16, 17, 18 ] ],
[ [ 19, 20, 21 ], [ 22, 23, 24 ], [ 25, 26, 27 ] ],
];
console.log(equals(reshape(range(1, 28), 3, 3), expected)); // range = [1, 27]functionreshape(list, perCol, perRow) {
let result = [];
for (let i = 0; i < list.length; i++) {
let row = Math.floor(i / (perCol * perRow)),
col = Math.floor((i / perRow) % perRow),
item = Math.floor(i % perCol);
result[row] = result[row] || []; // lazy init
result[row][col] = result[row][col] || []; // lazy init
result[row][col][item] = list[i];
}
return result;
}
.as-console-wrapper { top: 0; max-height: 100%!important; }
An example of a "table" generated from the matrix.
const matrix = [
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ],
[ [ 10, 11, 12 ], [ 13, 14, 15 ], [ 16, 17, 18 ] ],
[ [ 19, 20, 21 ], [ 22, 23, 24 ], [ 25, 26, 27 ] ],
];
renderMatrix(matrix);
functionrenderMatrix(matrix, target) {
let containerEl = document.createElement('div');
containerEl.className = 'container';
for (let s = 0; s < matrix.length; s++) {
let setEl = document.createElement('div');
setEl.className = 'set';
for (let r = 0; r < matrix[s].length; r++) {
let rowEl = document.createElement('div');
rowEl.className = 'row';
for (let c = 0; c < matrix[s][r].length; c++) {
let itemEl = document.createElement('div');
itemEl.className = 'item';
itemEl.textContent = matrix[s][r][c];
rowEl.appendChild(itemEl);
}
setEl.appendChild(rowEl);
}
containerEl.appendChild(setEl);
}
(target || document.body).appendChild(containerEl);
}
.container {
border: thin solid black;
}
.set {
border: thin solid green;
margin: 0.5%;
width: 98.5%;
}
.row {
display: inline-block;
border: thin solid red;
margin: 0.5%;
width: 31.75%;
}
.item {
display: inline-block;
width: 28%;
margin: 2%;
border: thin solid blue;
text-align: center;
}
Solution 2:
A quick bug fix to @MrPolywhril's solution posted above.
functionreshape(list, perCol, perRow) {
let result = [];
for (let i = 0; i < list.length; i++) {
let row = Math.floor(i / (perCol * perRow)),
col = Math.floor((i / perCol) % perRow),
item = Math.floor(i % perCol);
result[row] = result[row] || []; // lazy init
result[row][col] = result[row][col] || []; // lazy init
result[row][col][item] = list[i];
}
return result;
This slight modification allows for the dynamic create of any designed Column(perCol) x Row(perRow) matrix set. Meaning that you will be able to made a [4 x 2], [5 x 3] etc. matrix without any missing elements during creation. @MrPolywhril's first solution only successfully creates square matrix [4 x 4], [2 x 2], [5 x 5] sets without missing elements.
Post a Comment for "Vue.js - How To Convert A Simple Array To Dynamic Nxnxn Matrix"