以相同的方式对多个数组进行洗牌,但使用 Lodash

Shuffle multiple arrays in the same way but with Lodash

我有两个数组

const mp3 = ['sing.mp3','song.mp3','tune.mp3','jam.mp3',etc];
const ogg = ['sing.ogg','song.ogg','tune.ogg','jam.ogg',etc];

我需要打乱两个数组,使它们以相同的方式出现,例如:

const mp3 = ['tune.mp3','song.mp3','jam.mp3','sing.mp3',etc];
const ogg = ['tune.ogg','song.ogg','jam.ogg','sing.ogg',etc];

Whosebug 上有一些帖子按照我描述的方式随机排列数组 --this one is pretty great-- 但其中 none 演示了如何使用 Lodash[ 随机排列两个数组=32=].

JavaScript方法库被称为弱,它有sort()方法但没有shuffle()方法,因此,所有答案都是混合洗牌数组的逻辑 & And & 保持多个数组之间的洗牌相同。因此我认为在这里创建一个单独的问题是个好主意。

对于算法的洗牌部分,我选择了 Lodash,因为我正在使用它,它是那里最受欢迎的 JavaScript 实用程序库。

感谢!

一种简单的方法是只打乱索引数组,然后使用它以相应的顺序获取两个数组:

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>

但是,您不需要这样做。您的问题只是因为您以无用的方式存储数据而出现。由于两个数组的元素彼此明确链接,因此不应将它们存储为 2 个数组,而应存储为单个数组,其元素是将两个文件名作为属性保存的对象。这使您能够通过一次随机播放获得您想要的内容:

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>

(还值得注意的是,如果您的所有文件名都像您的示例中那样可预测地形成,即使这是不必要的 - 您可以只存储“原始”文件名:['sing', 'song', 'tune', 'jam'] 并添加任何文件扩展名你在需要的时候需要。但也许你的真实数据不是那么一致。)