提问者:小点点

如何在同一数组中随机匹配两个数据而不重复?


我正在寻找一个Js中的“随机化器”,它让我有可能从一个数组中给定的特定列表中获得几对数据。 我的目标是让smtgh随机匹配它们而没有任何重复,并根据数据的一半给出正确的列表。 我找到了这篇文章“JavaScript:Randomy pair items from array without repeats”,并使用了这篇文章,但它给出了所有可能的偶,我只想获得前5对偶(在本例中)。 有人能帮我吗? 太多了!

null

var names = ["Sean","Kyle","Emily","Nick","Cotter","Brian","Jeremy","Kimmy","Pat","Johnny"];
    pickpool = names.slice(0); // Slice the array at the first element to copy it by value

var used = [];
var picks = [];

if (names.length % 2 != 0) {
    alert("You must have an even number of names. You currently have " + names.length + " names.");
}

for( var i = 0; i < names.length; i++){

    var random = Math.floor(Math.random()*pickpool.length)

    if(names[random] == names[i]) {
        // names[random] = names[random++];
        picks.push(names[i] + " gets " + pickpool[random++]);
        pickpool.splice(random++,1);
    } else {
        picks.push(names[i] + " gets " + pickpool[random]);
        pickpool.splice(random,1);
    }
}
console.log("picked array: ");
for(var k=0; k<picks.length; k++) {
    console.log(picks[k]);
}

null


共3个答案

匿名用户

null

var names = ["Sean","Kyle","Emily","Nick","Cotter","Brian","Jeremy","Kimmy","Pat","Johnny"];
    pickpool = names.slice(0); // Slice the array at the first element to copy it by value

var used = [];
var picks = [];

if (names.length % 2 != 0) {
    alert("You must have an even number of names. You currently have " + names.length + " names.");
}

for( var i = 0; i < 5; i++){

    var random = Math.floor(Math.random()*pickpool.length)

    if(names[random] == names[i]) {
        // names[random] = names[random++];
        picks.push(names[i] + " gets " + pickpool[random++]);
        pickpool.splice(random++,1);
    } else {
        picks.push(names[i] + " gets " + pickpool[random]);
        pickpool.splice(random,1);
    }
}
console.log("picked array: ");
for(var k=0; k<5; k++) { //instead of the whole array stop after the fifth iteration
    console.log(picks[k]);
}

匿名用户

使用

let trimmed = picks.slice(0, 5);

picks = picks.slice(0, 5);

在你的代码之后。

它将修剪除前5项以外的所有其他项

匿名用户

使用lodash,您可以更整洁,更简单地解决这个问题:

const names = ["Sean","Kyle","Emily","Nick","Cotter","Brian"];
return _.chunk(_.shuffle(names), 2)