我正试图改组一个数组,但我想保持一些价值观。这里的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...
请注意2
和4
从未改变过他们的位置。
感谢任何帮助!
答案 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]);