3-х мерная матрица
Подскажите, правильно ли я делаю?
const matrix3D = []; for (let i = 0; i < 2; i++) { let z = []; for (let j = 0; j < 2; j++) { let y = []; for (let k = 0; k < 2; k++) { y[k] = 0; } z.push(y); } matrix3D.push(z); } console.log(JSON.stringify(matrix3D)) |
Можно так
function create3dMatrix(size) { return Array.from(Array(size), () => { return Array.from(Array(size), () => { return Array(size).fill(0); }); }); } console.log(JSON.stringify(create3dMatrix(2))); Со стрелочными: const create3dMatrix = size => Array.from(Array(size), () => Array.from(Array(size), () => Array(size).fill(0) ) ) |
ruslan_mart,
благодарю за ответ. function prettyPrint(data) { console.log(JSON.stringify(data)); } class Matrix3D { constructor(len) { this.x = len.x; this.y = len.y; this.z = len.z; this.buffer = []; } init() { const matrix3D = []; for (let i = 0; i < this.z; i++) { let z = []; for (let j = 0; j < this.y; j++) { let y = []; for (let k = 0; k < this.x; k++) { y[k] = (j * this.x + k + 1) + (((this.x * this.y * this.z) / this.z) * i); } z.push(y); } matrix3D.push(z); } this.buffer = matrix3D; prettyPrint(matrix3D); } set(coords, value) { this.buffer[coords.z][coords.y][coords.x] = value; } get(coords) { return this.buffer[coords.z][coords.y][coords.x]; } } const matrix = new Matrix3D({x: 2, y: 2, z: 2}); matrix.init(); matrix.set({x: 1, y: 1, z: 1}, 10); prettyPrint(matrix.get({x: 1, y: 1, z: 1})); prettyPrint(matrix.buffer); Как можно сделать лучше нумерацию? Сейчас у меня так: y[k] = (j * this.x + k + 1) + (((this.x * this.y * this.z) / this.z) * i); Выглядит как-то громозко... И как можно сделать без метода init? Ну т.е. new Matrix3D и все. Сразу buffer заполнить. |
Наверное как-то так
function prettyPrint(data) { console.log(JSON.stringify(data)); } class Matrix3D { constructor(len) { this.x = len.x; this.y = len.y; this.z = len.z; this.init(); } init() { const { x, y, z } = this; this.buffer = Array.from(Array(z), (_, i) => { return Array.from(Array(y), (_, j) => { return Array.from(Array(x), (_, k) => { return (j * x + k + 1) + (((x * y * z) / z) * i); }); }); }); } set(coords, value) { this.buffer[coords.z][coords.y][coords.x] = value; } get(coords) { return this.buffer[coords.z][coords.y][coords.x]; } } const matrix = new Matrix3D({x: 2, y: 2, z: 2}); matrix.init(); matrix.set({x: 1, y: 1, z: 1}, 10); prettyPrint(matrix.get({x: 1, y: 1, z: 1})); prettyPrint(matrix.buffer); |
Я бы вообще отказался от класса в пользу функции:
function prettyPrint(data) { console.log(JSON.stringify(data)); } function createMatrix3D(initObject) { const { x, y, z } = initObject; const buffer = Array.from(Array(z), (_, i) => Array.from(Array(y), (_, j) => Array.from(Array(x), (_, k) => j * x + k + 1 + ((x * y * z) / z) * i) ) ); return { buffer, get: (coords) => buffer[coords.z][coords.y][coords.x], set: (coords, value) => { buffer[coords.z][coords.y][coords.x] = value; }, }; } const matrix = createMatrix3D({ x: 2, y: 2, z: 2 }); prettyPrint(matrix.get({ x: 1, y: 1, z: 1 })); prettyPrint(matrix.buffer); Думаю нет смысл в классе ради двух методов |
А это ((x * y * z) / z) не равно x*y ?
|
Цитата:
|
ruslan_mart, а какой смысл через функцию делать в объектном стиле то же самое, что и через класс, но при этом менее оптимально? (методы класса хранятся в памяти один раз и переиспользуются, у твоего же возвращаемого объекта они каждый раз уникальны и кушают на себя память)
|
Смотря какое подразумевается использование, автор нигде не писал про 100500 вызовов)
Просто классом как-то более громоздко выглядит, ИМХО В современном фронте разве кто-то парится насчет создания лишних функций в памяти? Это все спички. Движок внутри все это умеет оптимизировать. На реакте вроде как тоже все ушли с классов в пользу функциональных компонентов, которые кучу анонимок плодят на каждый рендер) P.S.: Array.from вторым параметром тоже анонимку плодит, так-то, еще и в 3 степени. |
Aetae, смысла большого нет, вкусовщина по большей части. Думаю автор сам решит для себя, какой подход ему больше подходит :)
|
Часовой пояс GMT +3, время: 15:40. |