抱歉,如果这个问题很愚蠢,我认为这不是因为我找不到直接的答案。我正在尝试实现标准的 Fisher-Yates shuffle,但是在jQuery 包装的 DOM 元素数组上。 即通常的“交换”算法。
这个想法是实施洗牌一副牌。
我最初的简单(但 hacky)解决方案:
1)为每个DOM元素分配一个索引属性,同时创建一个索引列表。
indices = [];
deck.each(function(i){
$(this).attr('index',i);
indices[i] = i;
});
2) 打乱索引数组,
for(i=0;i<indices.length;i++){
temp = indices[i];
j = Math.floor((Math.random()*i));
indices[i]=indices[j];
indices[j]=temp;
}
并遍历它们,使用类似的东西,我不知道,说:
for(i=0;i<indices.length;i++){
randomCard = $('[index='+indices[i]+']');
//do amazing game-like things
}
但是......我讨厌这个解决方案,感觉非常hacky。我宁愿操纵包装好的套装。
所以...
再一次,这里是 Fisher-Yates shuffle 的伪代码。
deck.each(function(i){
temp = deck[i]; //except that I want deck[i] to be a **wrapped object**
j = Math.floor((Math.random()*i));
deck[i]=deck[j]; //and deck[j] should find a wrapped object in the 'elements' set with index j
deck[j]=temp; //and this should perform the swap.
alert("I can haz swapburgers!!!"); //yay.
});
我不明白如何做的部分是通过其索引设置 jQuery 包装对象中元素的值。我应该将索引和父元素传递给交换函数吗?就像是
swap($(this).parent(),i,j);
如果有人可以帮我解决这个问题,我将不胜感激。我希望这一切都清楚。请让我知道它是否令人困惑,我会尽力澄清。