tengo dos arreglos
const mp3 = ['sing.mp3','song.mp3','tune.mp3','jam.mp3',etc]; const ogg = ['sing.ogg','song.ogg','tune.ogg','jam.ogg',etc];Necesito barajar ambas matrices para que salgan de la misma manera, por ejemplo:
const mp3 = ['tune.mp3','song.mp3','jam.mp3','sing.mp3',etc]; const ogg = ['tune.ogg','song.ogg','jam.ogg','sing.ogg',etc];Hay algunas publicaciones en stackoverflow que mezclan matrices de la manera que describí, esta es bastante buena , pero ninguna de ellas demuestra cómo mezclar dos matrices usando Lodash .
La biblioteca de métodos de JavaScript se conoce como débil, tiene el método sort() pero no tiene el método shuffle() , por lo tanto, todas las respuestas mezclan la lógica de barajar una matriz & And & mantener la reproducción aleatoria idéntica entre múltiples arreglos Por lo tanto, pensé que crear una pregunta separada aquí sería una gran idea.
y para la parte de barajar del algoritmo, elegí Lodash , ya que lo estoy usando, y es la biblioteca de utilidades de JavaScript más popular que existe.
gracias!
Un enfoque simple es simplemente barajar la matriz de índices y luego usar eso para obtener ambas matrices en el orden correspondiente:
const mp3 = ['sing.mp3','song.mp3','tune.mp3','jam.mp3']; const ogg = ['sing.ogg','song.ogg','tune.ogg','jam.ogg']; const indices = _.shuffle([0, 1, 2, 3]); const shuffledMp3 = indices.map(idx => mp3[idx]); const shuffledOgg = indices.map(idx => ogg[idx]); console.log(shuffledMp3, shuffledOgg); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>Sin embargo, no debería necesitar hacer esto. Su pregunta solo surge porque está almacenando los datos de una manera inútil. Dado que los elementos de las dos matrices están claramente vinculados entre sí, no debe almacenarlos como 2 matrices, sino como una sola matriz cuyos elementos son objetos que contienen ambos nombres de archivo como propiedades. Esto le permite obtener lo que desea con una sola reproducción aleatoria:
const files = [{mp3: 'sing.mp3', ogg: 'sing.ogg'}, {mp3: 'song.mp3', ogg: 'song.ogg'}, {mp3: 'tune.mp3', ogg: 'tune.ogg'}, {mp3: 'jam.mp3', ogg: 'jam.ogg'}]; const shuffled = _.shuffle(files); console.log(shuffled.map(file => file.mp3)); console.log(shuffled.map(file => file.ogg)); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script> (También vale la pena señalar que si todos los nombres de archivo tienen una forma tan predecible como en su ejemplo, incluso esto es innecesario: puede almacenar los nombres de archivo "en bruto": ['sing', 'song', 'tune', 'jam'] y agregue la extensión de archivo que necesite en el momento en que la necesite. Pero quizás sus datos reales no sean tan consistentes).