JavaScript随机化数组但保留某些对

时间:2014-05-09 17:32:53

标签: javascript arrays random

我正试图改组一个数组,但我想保持一些价值观。这里的This excellent answer显示了如何改组,但我希望能够指定一个额外的参数,该参数需要保留一组值。

这就是我想要实现的目标。说我有一个数组:

[1, 2, 3, 4, 5]

我想像这样运行我的shuffle函数:

shuffle(arr, [1, 3])

这意味着,将数组洗牌,但要保持arr[1]arr[3]。所以我应该得到:

[3, 2, 1, 4, 5]
[5, 2, 3, 4, 1] etc...

请注意24从未改变过他们的位置。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

没有尝试过,我在痘痘时间编码了。不确定它是否有效,但我认为这个想法是值得的:拿出我们不想要的元素,把剩下的东西拿走,把这些元素放回原位。请看:splice()

function shuffle(array) {
    var currentIndex = array.length
    , temporaryValue
    , randomIndex
    ;

    // While there remain elements to shuffle...
    while ( 0 !== currentIndex ) {

        // Pick a remaining element...
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex -= 1;

        // And swap it with the current element.
        temporaryValue = array[currentIndex];
        array[currentIndex] = array[randomIndex];
        array[randomIndex] = temporaryValue;
    }

    return array;
}


function shuffle2(array,aux){
    var i;
    var keeper = [];
    for( i = 0; i < aux.length; i++ ) {
        keeper[i] = array[aux[i]];
    }
    for ( i = aux.length-1; i >= 0; i-- ) { // It's important to do this from the last to the first
        array.splice(aux[i], 1); // This will remove the index element shifting the rest of elemnts
    }
    shuffle(array);
    // Now we put back the elements we took out.
    for ( i = 0; i < aux.length; i++ ) {
        array.splice(aux[i], 0, keeper[i]); // This will remove the index element shifting the rest of elemnts
    }
    return array;
}

答案 1 :(得分:1)

这个使用一个数组方法,从数组中返回一个随机元素。

该函数切片一个新数组并从中删除守护者,

然后随机替换那些“shuffleable&#39;

”的索引

守护者插入不变。

Array.prototype.getRandom= function(cut){
    var i= Math.floor(Math.random()*this.length);
    if(cut) return this.splice(i, 1)[0];
    return this[i];
}
function customShuffle(arr, save){
    var A= [], B= arr.slice(), 
    tem, L= arr.length, LS= save.length;
    while(LS){
        tem= save[--LS];
        B.splice(tem, 1);
    }
    for(var j= 0; j<L; j++){
        if(save.indexOf(j)!= -1) A[j]= arr[j];
        else A[j]= B.getRandom(1);
    }
    return A;
}

var arr = [1,2,3,4,5,6,7,8,9];

customShuffle(arr,[1,3,7]);