Estoy escribiendo una animación de píxeles leyendo datos de un Unit8Array que contiene 5 cuadros, 72 binarios cada uno. Ahora pensé en invertir los fotogramas para invertir la animación. Entonces mi pregunta:
¿Hay alguna manera de revertir en bloque, o alguien tiene una idea creativa, cómo podría hacerlo? (No puedo simplemente correr hacia atrás, ya que cada cuadro necesita la información del anterior)
const myArr = [1,2,3,4,5,6,7,8]; console.log(myArr.reverse());//8,7,6,5,4,3,2,1 //how to reach [7,8,5,6,3,4,1,2]? //would work fine with 2D array, //but don't have 2D const my2D = [[1,2],[3,4],[5,6],[7,8]];Esto debería hacerlo:
const reversed = myArr .map((_, i, a) => a[i ^ 1]) .reverse()La forma en que funciona es que asigna cada elemento de la matriz a otro elemento con el índice cambiado al invertir el bit 1 usando XOR (por ejemplo, 4 ^ 1 = 5, 5 ^ 1 = 4, 6 ^ 1 = 7, 7 ^ 1 = 6, etc.) y luego invirtiendo toda la matriz.
Este truco se puede usar para cualquier potencia de dos: puedes invertir grupos de 4 elementos usando ^ 3 para voltear los bits 1 y 2, grupos de 8 usando ^ 7 para voltear los bits 4, 2 y 1 y así sucesivamente. (Si necesitara otros tamaños de grupo, tendría que usar una operación más costosa como i + size - 1 - 2 * (i % size) en su lugar).
map llama a la devolución de llamada con varios argumentos: el primero es el valor del elemento, pero en realidad no lo necesitamos, por lo que lo asignaremos a una variable no utilizada _ . El segundo es el índice y el tercero es la propia matriz. En realidad solo necesitamos el índice, pero con el tercer argumento podemos evitar escribir el nombre de la matriz dos veces en la línea ( myArr.map((_, i) => myArr[i ^ 1]) también funcionaría).
Nota: dependiendo de su caso de uso exacto, tal vez otra opción sería hacer una array.length - i ^ 1 en el índice al acceder a los datos, en lugar de crear una nueva matriz.
Inspirado en la respuesta de CherryDT, se puede hacer con una llamada de map :
const arr = [1,2,3,4,5,6,7,8]; console.log( arr.map((_, i) => arr[arr.length - i - 1 ^ 1]) );