deep copy avec Array.from
Bonjour,
Une des utilisations possibles de Array.from, si j'ai bien compris, est de faire une copie d'un tableau en préservant l'original ( = deep copy).
J'ai fait un premier test:
Code:
1 2 3 4 5 6
|
const a1 = [2, 3, 5];
const a2 = Array.from(a1);
a2[0] += 1;
console.log(a1, a2);
// renvoie (3) [2, 3, 5] (3) [3, 3, 5] |
Mon tableau d'origine est bien intact.
Par ailleurs, je suis en train de rédiger une classe me permettant de travailler avec des matrices. Le constructeur prend en argument un tableau de tableaux:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
class Matrix {
constructor(array) {
this.array = array;
this.height = array.length;
this.width = array[0].length;
}
multiply(k) {
const temp = Array.from(this.array);
for (let i = 0; i < this.height; i += 1) {
for (let j = 0; j < this.width; j += 1) {
temp[i][j] *= k;
}
}
return new Matrix(temp);
}
}
const M = new Matrix([[1, 2], [1, 0]]);
const N = M.multiply(2);
console.log(M); |
Et là, cela ne fonctionne pas.
Ma matrice M initiale est multipliée par 2 alors que je voulais que seule ma matrice N soit modifiée.
j'ai fait quelques tests: si je me contente d'ajouter 1 à un des nombres de la matrice temp, la matrice désignée par this.array est aussi modifiée.
Quelqu'un peut-il m'éclairer?
Merci d'avance.
Raphaël
code corrigé grâce à Mathieu
Au cas où cela intéresse quelqu'un, je colle la solution:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
multiply(k) {
// deep copy de this.array
const temp = [];
for (let i = 0; i < this.height; i += 1) {
temp.push(Array.from(this.array[i]));
}
for (let i = 0; i < this.height; i += 1) {
for (let j = 0; j < this.width; j += 1) {
temp[i][j] *= k;
}
}
return new Matrix(temp);
} |