Me gustaría crear una copia de una matriz pero cambiando la posición de las matrices más internas. Esta es la matriz original:
const primera = [ [["a","b"],["c","d"]], [["a","c"],["b","d"]], [["a","d"],["c","b"]] ]Quiero crear otra matriz como esta pero sin modificar la matriz "primera":
[ [["b","a"],["d","c"]], [["c","a"],["d","b"]], [["d","a"],["b","c"]] ]He intentado esto, pero cuando consuelo. registro ambas matrices, la matriz original se modifica.
const primera = [ [["a","b"],["c","d"]], [["a","c"],["b","d"]], [["a","d"],["c","b"]] ] const doubleRound = (arr) => { const newArr = [...arr] for(let i=0; i<newArr.length;i++) { for(let j=0; j<newArr[i].length;j++) { newArr[i][j] = [newArr[i][j][1],newArr[i][j][0]] } } return newArr } const segunda = doubleRound(primera) console.log(primera) console.log(segunda)¿Alguna idea de cómo puedo hacerlo? Gracias.
[...arr] es solo una copia superficial, lo que significa que la matriz anidada todavía se pasa por referencia y si cambia una, la versión de clonación también cambia.
Para una copia profunda, puede usar JSON.parse(JSON.stringify(arr)). Esto creará un clon para matrices anidadas
const primera = [ [["a","b"],["c","d"]], [["a","c"],["b","d"]], [["a","d"],["c","b"]] ] let secundo = JSON.parse(JSON.stringify(primera)); for(let i = 0; i<secundo.length; i++){ for(let j=0; j<secundo[i].length; j++){ [secundo[i][j][0], secundo[i][j][1]] = [secundo[i][j][1], secundo[i][j][0]] } } console.log(primera) console.log(secundo)... hace una copia superficial. Por lo tanto, las matrices (y los objetos) de varios niveles no se copian profundamente.
Aquí hay una posible solución, basándose en la suya.
En primer lugar, comience con una matriz vacía. Y empuje una matriz vacía para cada i . Para cada índice j , inserte nuevamente en el elemento de matriz secundario.
No hay necesidad de preocuparse por el error de los índices de esta manera.
const primera = [ [["a","b"],["c","d"]], [["a","c"],["b","d"]], [["a","d"],["c","b"]] ] const doubleRound = (arr) => { const newArr = []; for(let i=0; i<arr.length;i++) { newArr.push([]); for(let j=0; j<arr[i].length;j++) { newArr[i].push([arr[i][j][1],arr[i][j][0]]); } } return newArr } const segunda = doubleRound(primera) console.log(primera) console.log(segunda)