如何随机(洗牌)Javascript集

如何随机(洗牌)Javascript集,javascript,arrays,set,shuffle,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.lo

我想合并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());
}

如果您询问是否有更好的功能,那么(ES2015(ES6))这可能会有所帮助


如果我不理解你的问题,那么很抱歉。

在创建集合之前随机化数组,这样您就可以获得集合的好处,即删除重复项,但可以洗牌其数据。不过,这假设了很多事情(您想经常重新洗牌吗?以后会向集合中添加更多项目吗?…)

const arr1=[1,2,3];
常数arr2=[10,20,30];
常数arr3=[100200300];
const arrs=shuffle([…arr1,…arr2,…arr3]);
常数d=新集合(arrs);
常量迭代器=d.values();
for(设i=0;i<9;i++){
log(iterator.next());
}

这里有一个答案,可能并不花哨,但很有效。在伪代码中:

  • 使用spread或concat组合您的阵列(看起来您正在这样做)
  • 创建一个新的数组来容纳你的随机洗牌。现在,它是空的
  • 虽然新数组的长度不是合并数组的长度,但请从合并数组中选择一个随机数。如果新阵列中未包含该数字,请将其添加到新阵列中

  • 如果你只想洗牌数组,那么在这里?我的问题中已经提到了这一点。我不是说我没有办法。我在问是否有更好的方法。如何更好?更小更快?更容易理解?对Javascript来说更惯用、更高效。回程去ArrayLand似乎是一个解决办法,我认为还有其他方法。在复制方面,我认为在洗牌数组之前合并集合更有效,因为洗牌的元素更少。不过还是要谢谢你的主意!是的,这取决于元素的数量,以后您是喜欢将事物保留在集合中还是作为数组。有趣的东西。不,问题不是关于数组,而是关于集合,以及如何在不使用数组的情况下洗牌,否则,正如你所看到的,我已经知道如何做了。。。对不起。
    let setArray = Array.from(d);
    shuffleArray(setArray);
    const randomSet = new Set(setArray);
    
    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());
    }