Sha*_*vil 4 javascript arrays random jquery unique
这是一个 Javascript / jQuery 问题:
我正在尝试使用jQuery.inArray方法生成 1 到 21(无重复)之间的六个唯一随机数。然后,这六个数字将用于从名为 logo1.jpg 到 logo21.jpg 的组中选择六个 .jpg 文件。
谁能告诉我我在这里做错了什么?
<div id="client-logos"></div>
<script src="http://code.jquery.com/jquery-1.5.js"></script>
<script type="text/javascript">
Show = 6; // Number of logos to show
TotalLogos = 21; // Total number of logos to choose from
FirstPart = '<img src="/wp-content/client-logos/logo';
LastPart = '.jpg" height="60" width="120" />';
r = new Array(Show); // Random number array
var t=0;
for (t=0;t<Show;t++)
{
while ( jQuery.inArray(x,r)
{
var x = Math.ceil(Math.random() * TotalLogos);
});
r[t] = x;
var content = document.getElementById('client-logos').innerHTML;
document.getElementById('client-logos').innerHTML = content + FirstPart + r[t] + LastPart;
}
</script>
Run Code Online (Sandbox Code Playgroud)
提前致谢...
你有几个问题:
全局窗口范围内的变量
用new
关键字而不是文字 声明的数组
在声明变量之前尝试使用它们
jQuery.inArray 被错误使用(inArray 返回一个数字,而不是true
或false
)
具有while
循环的低效代码,理论上可能导致无限循环
现在,第二个与第三个结合是这里的主要问题,因为您第一次x
在数组中测试它undefined
(您只是在if
withvar
语句中定义它,所以 x 首先未定义),因此它匹配数组中的第一个元素(undefined
正如您用 声明r
的那样new Array(6)
)和 inArray 函数返回 1,这会导致无限循环。
您可以做几件事来修补该代码,但我认为用不同的方法完全重写可能会更好,并且根本不需要 jQuery。
您的代码的这个修改版本应该可以正常工作:
var Show = 6, // Number of logos to show
TotalLogos = 21, // Total number of logos to choose from
FirstPart = '<img src="/wp-content/client-logos/logo',
LastPart = '.jpg" height="60" width="120" />',
array = [], // array with all avaiilable numbers
rnd, value, i,
logosElement = document.getElementById('client-logos');
for (i = 0; i < TotalLogos; i++) { // arrays are zero based, for 21 elements you want to go from index 0 to 20.
array[i] = i + 1;
}
for (i = 0; i < Show; i++) { // pick numbers
rnd = Math.floor(Math.random() * array.length);
value = array.splice(rnd,1)[0]; // remove the selected number from the array and get it in another variable
logosElement.innerHTML += (FirstPart + value + LastPart);
}
Run Code Online (Sandbox Code Playgroud)
解释一下我在这里做了什么:
使用您拥有的所有可能值初始化一个数组(数字 1 到 21)
只运行与您想要选择的数字一样多的循环。
生成一个从 0 到数字数组中可用的最大索引的随机数
使用 splice 从数组中删除该索引处的数字,然后使用它为 innerHTML 调用创建字符串(splice 将从数组中删除的元素作为另一个新数组返回)。
此外,该logosElement
变量在开始时被缓存,因此您只需对该元素进行一次 DOM 查找。
有更多方法可以重写甚至清理代码,但我认为这将是帮助您解决问题的最干净的方法(而且它是跨浏览器安全的!除非您需要其他功能,否则无需添加 jQuery)
归档时间: |
|
查看次数: |
5331 次 |
最近记录: |