我有一些代码可以从列表中随机突出显示一个名称(这有效 - 请参阅this fiddle):
function pickRandom() {
var random = Math.floor(Math.random() * 6);
$('.stname').css('background','none').eq(random).css('background','yellow');
}
但我想确保相同的名字不会反复出现。所以我打算记住最后3个选择的索引作为黑名单:
var recentlyAsked = new Array();
function pickRandom() {
var random;
do {
random = Math.floor(Math.random() * 6);
} while ($.inArray(random,recentlyAsked));
recentlyAsked.push(random);
if (recentlyAsked.length >= 4) recentlyAsked.shift();
$('.stname').css('background','none').eq(random).css('background','yellow');
}
这不起作用;见this fiddle。 警告:会导致浏览器挂起。
有什么建议吗?
答案 0 :(得分:4)
do {
random = Math.floor(Math.random() * 6);
} while ($.inArray(random,recentlyAsked));
永远运行,因为inArray
在数组中找不到项目时返回-1
,这是一个真值。 0
是唯一一个有价值的数字。您的数组最初为空,因此找不到任何内容。
修复:
do {
random = Math.floor(Math.random() * 6);
} while ($.inArray(random,recentlyAsked) > -1);
当它返回-1
(未找到)
答案 1 :(得分:1)
var ids=['a','b','c'];
var old=['d','e','f'];//At the beginning this will need populated with 3 random values
var ran=Math.floor(Math.random() * ids.length);
var ele=ids.splice(ran,1);
old.push(ele);
ids.push(old.shift());
highlight(ele);
这是一种稍微替代的方式来做你想要的。想法是删除所选元素,然后将其重新添加到原始数组中。
答案 2 :(得分:1)
以为我会把我的代码扔出去:
var randomArray = new Array(0, 1, 2, 3, 4, 5);
var pastArray = new Array();
function pickRandom() {
var random = Math.floor(Math.random() * randomArray.length);
$('.stname').css('background', 'none').eq(randomArray[random]).css('background', 'yellow');
if (pastArray.length < 3) {
pastArray.unshift(randomArray[random]);
randomArray.splice(random, 1);
} else {
pastArray.unshift(randomArray[random]);
randomArray.splice(random, 1, pastArray.pop());
}
console.log("possible values: [" + randomArray + "]");
console.log("past values: [" + pastArray + "]");
}
值从当前值和过去值来回移动。没有必要将值预先填充为“过去”,因此它始终是真正随机的。