如何随机化(随机播放)JavaScript集

时间:2018-08-31 15:23:14

标签: javascript arrays set shuffle

我想合并3组,然后对它们的并集进行迭代,但是我希望此并集是随机的。

如果我这样做:

const a = new Set([1,2,3]);
const b = new Set([10,20,30]);
const c = new Set([100,200,300]);
const d = new Set([...a, ...b, ...c]);
const iterator = d.values();
for (let i = 0; i < 9; i++) {
    console.log(iterator.next());
}

我显然使它们井然有序,而不是将它们拖曳。 除了使用this question中的改组数组函数之外,还有另一种(更惯用和/或更有效)的方式:

let setArray = Array.from(d);
shuffleArray(setArray);
const randomSet = new Set(setArray);

3 个答案:

答案 0 :(得分:1)

在创建集合之前先对数组进行随机化,这样一来,您可以获得删除重复项的好处,但可以重新整理其数据。但这假设了很多事情(您是否要经常重新洗牌?是否会在以后添加更多项目?)

const arr1 = [1, 2, 3];
const arr2 = [10, 20, 30];
const arr3 = [100, 200, 300];
const arrs = shuffle([ ...arr1, ...arr2, ...arr3 ]);

const d = new Set(arrs);
const iterator = d.values();
for (let i = 0; i < 9; i++) {
    console.log(iterator.next());
}

答案 1 :(得分:0)

如果您问是否有更好的功能,那么也许How can I shuffle an array?(ES2015(ES6))会有所帮助。

如果我不明白你的问题,那就对不起。

答案 2 :(得分:0)

这是一个可能并不理想的答案,但可行。用伪代码:

  1. 使用spread或concat组合数组(看起来就像在做的那样)
  2. 创建一个新数组,其中将保留您的随机洗牌。现在,它是空的。
  3. 虽然新数组不是合并数组的长度,但是请从合并数组中选择一个随机数。如果新阵列中未包含该数字,请将其添加到新阵列中。