![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 17:53
|
Аспирант
|
|
Регистрация: 24.10.2023
Сообщений: 58
|
|
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))
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 19:25
|
![Аватар для ruslan_mart](https://javascript.ru/forum/image.php?u=20699&dateline=1502382178) |
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Можно так
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, 27.10.2023 в 19:28.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 19:54
|
Аспирант
|
|
Регистрация: 24.10.2023
Сообщений: 58
|
|
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 заполнить.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 20:22
|
![Аватар для ruslan_mart](https://javascript.ru/forum/image.php?u=20699&dateline=1502382178) |
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Наверное как-то так
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);
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 20:33
|
![Аватар для ruslan_mart](https://javascript.ru/forum/image.php?u=20699&dateline=1502382178) |
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Я бы вообще отказался от класса в пользу функции:
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);
Думаю нет смысл в классе ради двух методов
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 20:39
|
![Аватар для voraa](https://javascript.ru/forum/image.php?u=69123&dateline=1640150450) |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,756
|
|
А это ((x * y * z) / z) не равно x*y ?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 20:42
|
![Аватар для voraa](https://javascript.ru/forum/image.php?u=69123&dateline=1640150450) |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,756
|
|
Сообщение от ruslan_mart
|
Я бы вообще отказался от класса в пользу функции:
|
И для каждой матрицы (будь их хоть 100500) будут свои функции get и set. Вместо одной в прототипе.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 20:45
|
![Аватар для Aetae](https://javascript.ru/forum/image.php?u=4993&dateline=1299014303) |
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
ruslan_mart, а какой смысл через функцию делать в объектном стиле то же самое, что и через класс, но при этом менее оптимально? (методы класса хранятся в памяти один раз и переиспользуются, у твоего же возвращаемого объекта они каждый раз уникальны и кушают на себя память)
__________________
29375, 35
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 20:54
|
![Аватар для ruslan_mart](https://javascript.ru/forum/image.php?u=20699&dateline=1502382178) |
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Смотря какое подразумевается использование, автор нигде не писал про 100500 вызовов)
Просто классом как-то более громоздко выглядит, ИМХО
В современном фронте разве кто-то парится насчет создания лишних функций в памяти? Это все спички. Движок внутри все это умеет оптимизировать.
На реакте вроде как тоже все ушли с классов в пользу функциональных компонентов, которые кучу анонимок плодят на каждый рендер)
P.S.: Array.from вторым параметром тоже анонимку плодит, так-то, еще и в 3 степени.
Последний раз редактировалось ruslan_mart, 27.10.2023 в 20:57.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
27.10.2023, 21:00
|
![Аватар для ruslan_mart](https://javascript.ru/forum/image.php?u=20699&dateline=1502382178) |
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Aetae, смысла большого нет, вкусовщина по большей части. Думаю автор сам решит для себя, какой подход ему больше подходит ![](https://javascript.ru/forum/images/smilies/smile.gif)
|
|
|
|