记住jQuery中的最后n个项目

时间:2011-11-19 19:06:52

标签: javascript jquery arrays queue

我有一些代码可以从列表中随机突出显示一个名称(这有效 - 请参阅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警告:会导致浏览器挂起。

有什么建议吗?

3 个答案:

答案 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 + "]");
}

值从当前值和过去值来回移动。没有必要将值预先填充为“过去”,因此它始终是真正随机的。