.数组排序:arr.sort()
强调:(1)直接修改原数组。
(2)默认按照数组元素第一位的ASCII码从小到大排列。
(3)可以设置下列的比较器函数来控制升序,降序或者打乱。
(4)arr.sort(function(a,b){return a-b;}); 升序(只限数组中是数字或者数字字符串)。
(5)arr.sort(function(a,b){return b-a;}); 降序(只限数组中是数字或者数字字符串)。
(6)arr.sort(function(){
return Math.random()>.5 ? 1 : -1;
});随机打乱数组(数组中可以是任何数据类型)
应用场景: 主要用于对数组进行排序,常用案例有:按id进行排序,按照时间进行排序 从大到小,按照中文进行排序
底层原理: JS中的sort()方法用于对数组进行排序,并返回数组。
默认情况下按升序排列数组,但是是根据字符串UniCode码进行比较。sort()方法进行排序时会在每一项上调用String()转型函数,然后通过字符串UniCode码来决定顺序,即使数组的元素都是number类型,也会把它转换成字符串再比较。
为此,sort(compareFunction)方法可以接受一个参数,此参数为函数,从而达到我们想要的比较效果。
如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana"会被排列到 “cherry” 之前。数字比大小时,2 出现在 10 之前,但这里比较时数字会先被转换为字符串,所以 “10” 比 "2"要靠前。
如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
sort默认的排序方式为字母排序,根据二十六个字母依次排列,单词之间比较,则先比较第一个字母,如果第一个字母相同则比较第二个字母,以此类推。
// 1.字母排序(sort默认排序)
var arr = ["za","zb","a","b","xc","xa"];
arr.sort();
console.log(arr);
// 运行结果:["a", "b", "xa", "xc", "za", "zb"]
sort()中参数可以是方法函数,可以升序和降序输出结果。
//2.sort数字排序
var array = [100,10,50,800,320,34,53];
array.sort(function(a,b){
//a-b升序,b-a降序
return b-a; });
console.log(array);
//运行结果:[800, 320, 100, 53, 50, 34, 10]
注意: 其中a,b都是表示这个数组里面的元素,如果是a-b则表示升序,如果是b-a则表示降序。
最重要的还是这个对象属性排序,当后台给我们前端很多数据并且没有排序时,我们一般都是要重新进行排序,而后台给的数据往往是好几层,不会像前面那种简单的就一个数组,这个时候就要用sort中对象属性排序了
// 3.对象属性排序
var obj = [
{name:"lucy", num:400},
{name:"nancy", num:110},
{name:"maria", num:200} ];
obj.sort(compare("num"));
console.log(obj);
//数组对象属性值排序
function compare(property){
return function(a,b){
//value1 - value2升序
//value2 - value1降序
var value1 = a[property];
var value2 = b[property];
return value1 - value2;
//升序 } }
//运行结果:
//[\
//{name:"nancy", num:110},\
//{name:"maria", num:200},\
//{name:"lucy", num:400}\
//]
注意: compare()中参数必须是这个对象的属性名称,而你要比较的这些对象里面,一定要有这个属性名称,否则会出错