El problema es que ( permuteVector ) funciona perfectamente si itero sobre una matriz anidada que se declara así: let test = [[3, 5, 3],[2, 6, 7],[10, 0, 9], [5, 4, 3, 2]] . En ese caso, puedo cambiar solo un elemento de una matriz (por ejemplo , test[1] ) sin afectar a todos los demás elementos. Cuando trato de hacer lo mismo con la matriz de rompecabezas (como se pretendía) creada con ( makeVector ), no puedo cambiar un solo elemento sin afectarlos a todos.
Parece que todos los elementos de la matriz del rompecabezas tienen el mismo punto de referencia. Agradecería cualquier pista.
class Queue { constructor() { this.q = []; } enqueue(el) { this.q.push(el); } dequeue() { if (this.q.length > 0) { return this.q.shift(); } else { return 'Underflow'; } } isEmpty() { return this.q.length == 0; } head() { if (this.q.length > 0) { return this.q[0]; } else { return 'Queue is empty'; } } show() { return this.q; } } // let row = [2, 4, 1, 3]; // let puzzle = []; // const makeVector = function (row, n) { let puzzle = []; for (let i = 0; i < n; i++) { puzzle.push(row); } return puzzle; }; // makeVector(row, 4); let puzzle = makeVector(row, 4); console.log(puzzle); // const permuteVector = function (row, p) { let q1 = new Queue(); //1. Creating queue from a vector for (let i = 0; i < row.length; i++) { q1.enqueue(row[i]); } //2. Shifting queue by p elements to the left for (let i = 0; i < p; i++) { if (p == 0) { return row; } else { let head = q1.head(); q1.enqueue(head); q1.dequeue(head); } } //3. Populating Queue to original Vector row.splice(0, row.length, ...q1.show()); }; // With this it works - I can shift single element of an array without affecting others let test = [ [3, 5, 3], [2, 6, 7], [10, 0, 9], [5, 4, 3, 2] ]; permuteRows(test[1], 2); // This will not work as intended, it will affect all elements instead of one permuteVector(puzzle[0], 1);El problema es que le estás asignando a tu rompecabezas la fila, y eso se pasa por referencia, así que cuando modificas la fila, estás alterando esa referencia (que es cuatro veces en tu matriz de rompecabezas). Debes copiar el valor:
puzzle.push([...row]);Más información sobre el valor y la referencia de JavaScript: https://www.geeksforgeeks.org/primitive-and-reference-value-in-javascript/