今天面试的时候,被问到:给一个数组,怎么随机打乱数组。当时被问到的时候第一时间想到了Math.random()的方法,即用random产生在数组长度以内的下标值,可是这样的话,怎么控制产生下标不会重复呢,所以我又想到了set,将每一次产生的下标保存到set中,产生跟数组相同长度的集合,这样来打乱数组。然而这种做法有很大很大的问题,因为random是随机产生数据,可能执行了无数n次才能得到固定长度的集合,所以这种很不可行。然后突然想到取余的方法就脱口而出了,因为隐约记得取余是可以的,可是怎么一个mod法自己还没想到。所以当面试官问到怎么取余的时候自己也答不上来了。后来面试官提示了一下有没有想到sort()方法(面试官还是挺好的),然而我还是丝毫无头绪,sort()不就是排序的么,自己一直以为他的用法是arr.sort()来排序且是升序的。这是自己对sort()的一个误区。所以回来就百度了一下怎么随机打乱数组,没想到竟然使用sort()!!!一脸惊讶,原来sort()还可以这样子用的,赶快查阅了sort()的用法,并记下这篇博客。
首先,sort()方法是对数组进行排序并返回数组的一个方法。默认排序是根据字符串的unicode码点的(这个后面会解释是怎样的)。
语法:arrayObject.sort(compareFunction),这个compareFunction参数是可选的,是规定排序顺序,且必须是函数。
如果调用sort()方法时没有使用参数,即arr.sort(),则将按照字符的unicode编码的顺序排序。
下面这个例子可以说明:
首先,sort()方法是对数组进行排序并返回数组的一个方法。默认排序是根据字符串的unicode码点的(这个后面会解释是怎样的)。
语法:arrayObject.sort(compareFunction),这个compareFunction参数是可选的,是规定排序顺序,且必须是函数。
如果调用sort()方法时没有使用参数,即arr.sort(),则将按照字符的unicode编码的顺序排序。
下面这个例子可以说明:
var arr = [1,12,5,34,3,52,45,4]; arr.sort();
输出:
[1, 12, 3, 34, 4, 45, 5, 52]
为什么这样呢,是因为在unicode中指针顺序中"12"在"3" 之前。
如果想要升序或者降序或者说我们这里随机的方式来排序,就需要指明compareFunction函数了。方式如下:
(1)如果compareFunction(a,b)的返回值小于0,那么a会被排列到b之前;
(2)如果compareFunction(a,b)的返回值等于0,a和b的相对位置不变;(es标准并不保证这一行为,而且也不是所有浏览器都会遵守的,例如Mozilla在2003年之前的版本)
(3)如果compareFunction(a,b)的返回值大于0,那么a会被排列到b之后。
比较函数的格式如下:
function compare(a, b) { if (a < b ) { // 按某种排序标准进行比较, a 小于 b return -1; } if (a > b ) { return 1; } // a must be equal to b return 0; }
具体的sort()的用法,可以看下面这个链接,讲的很详细。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
下面就说如何随机打乱数组吧:
var arr = [1,12,5,34,3,52,45,4];
arr.sort(function(a,b) { return Math.random()>0.5?1:-1; });
以上。。。