我在网上发现这个代码用于改组数组元素,它运行良好,但我无法理解这里的for
循环
shuffle = function(o)
{
for(var j, x, i = o.length; i;
j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
感谢任何帮助,谢谢!
答案 0 :(得分:3)
这基本上是对for
循环的灵活性的误用。
for
循环的一般语法是:
for (<init>; <condition>; <increment>) {
<body>
}
大致可以表示为以下while
循环:
<init>;
while(<condition>) {
<body>
<increment>
}
由于<body>
和<increment>
都被执行,就好像它们位于while
的正文中一样,任何可以进入for
循环体内的东西,也可以放在<increment>
循环的for
表达式中。你只需要用逗号分隔语句而不是分号。
因此,您的for
循环可能更好地表示为while
循环:
var j, x, i = o.length;
while (i) { // same as while(i != 0)
j = parseInt(Math.random() * i);
x = o[--i];
o[i] = o[j];
o[j] = x;
}
答案 1 :(得分:2)
j = parseInt(Math.random() * i); // Getting a random number between 0 to n-1, where n is the length of the array.
x = o[--i]; // Getting the last element of the array and storing it in a variable.
o[i] = o[j]; // Storing the randomly selected index value at the last position.
o[j] = x; // Storing the last element's value in random position.
我的值将在每次循环迭代中递减,它将替换最后一个然后倒数第二个,然后依次......并且最终在数组中第一个元素中包含aray中的随机元素。