@xudongh
2017-03-05T08:54:44.000000Z
字数 1665
阅读 1734
前端开发
在JS中有两种可以直接用来重排序的方法:reverse()和sort()。
reverse()方法会翻转数组项的顺序,并返回原数组。
var arr = [1,2,3,4,5];arr.reverse();console.log(arr); //[5,4,3,2,1]
sort()方法更加灵活,可按照一定的规则进行排序,其语法为:
arr.sort(compareFunction);
compareFunction是用于指定按某种顺序进行排列的函数,在不指定该函数时,即默认情况下, sort()方法按照升序排列数组项——即最小的值位于最前面,最大的值排在最后面。
由于sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,因此数组元素实际上的排序方法是按照数组中每个字符的Unicode码进行排序。
var arr = [5,10,0,15,1];arr.sort();console.log(arr); //[0,1,10,15,5]
在指定compareFunction的情况下,该函数接受两个参数,数组会按照调用该函数的返回值进行排序。即a和b是两个将要被比较的元素:
compareFunction(a,b)<0,则a被排列在b之前;compareFunction(a,b)=0,a和b的相对位置不变;compareFunction(a,b)>0,则a被排列在b之后。因此,假如要对一个数组进行升序排序,可以这样做:
var arr = [5,10,0,15,1];//比较常用的比较函数function compare(a,b){return a-b;}arr.sort(compare);console.log(arr); //[0,1,5,10,15]
以上针对的是一维数组的排序,对于二维数组,同样可以采用sort()方法。
在compareFunction()函数中,要注意比较参数的传参问题。
例如有一组同学的名字以及对应身高的数据,现要对身高进行降序排列。
var arr=[["小明",172],["小刚",182],["小红",168],["小强",176],["小云",172]];//二维数组的比较函数function compare(a,b){return b[1]-a[1]}arr.sort(compare);console.log(arr); //[["小刚", 182], ["小强", 176], ["小明", 172], ["小云", 172], ["小红", 168]]
若不使用sort()方法,使用算法排序对一位数组进行排序(当然我们在js中没必要这样做),如用冒泡排序:
function compare(arr){var i = arr.length,j;while(i > 0){for(var j = 0; j<i-1; j++){if(arr[j]>arr[j+1]){var tem = arr[j+1];arr[j+1] = arr[j];arr[j] = tem;}}i--;}return arr;}var arr = [5,10,0,15,1];console.log(compare(arr)); //[0, 1, 5, 10, 15]
同样,对二维数组用算法排序,和一维数组的排序并无异同:
function compare(arr){var i = arr.length,j;while(i > 0){for(var j = 0; j<i-1; j++){if(arr[j][1]>arr[j+1][1]){var tem = arr[j+1][1];arr[j+1][1] = arr[j][1];arr[j][1] = tem;}}i--;}return arr;}var arr=[["小明",172],["小刚",182],["小红",168],["小强",176],["小云",172]];console.log(compare(arr)); //[["小明", 168], ["小刚", 172], ["小红", 172], ["小强", 176], ["小云", 182]]