如何使用 jQuery.inArray 方法选择一组唯一的随机数(无重复)?

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)

提前致谢...

gon*_*uki 5

你有几个问题:

  • 全局窗口范围内的变量

  • new关键字而不是文字 声明的数组

  • 在声明变量之前尝试使用它们

  • jQuery.inArray 被错误使用(inArray 返回一个数字,而不是truefalse

  • 具有while循环的低效代码,理论上可能导致无限循环

现在,第二个与第三个结合是这里的主要问题,因为您第一次x在数组中测试它undefined(您只是在ifwithvar语句中定义它,所以 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)