最近的项目开发中用到了数组的排序,想着将平时遇到的问题整理下来,算是一种积累,闲话少叙,开始正题:
sort() 方法用于对数组元素进行排序,并返回数组,默认排序是根据字符串的Unicode码点
语法:arrayObject.sort(sortby),其中sortby可选,规定数组排序顺序,必须是函数
注:如果调用该方法时没有使用参数,将按照字母顺序对数组中的
元素进行排序,说的更精确一些,是按照字符编码的顺序进行排序,要实现这一点,首先应该把数组的元素都转换成字符串,以便进行比较。
如果想要按照其它的标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字,比较函数应该具有两个参数a,b 其返回值如下:
(1)若a小于b ,在排序后的数组中a 应该出现在b之前,则返回一个小于0的值
(2)若a等于b,则返回0
(3)若a大于b,则返回一个大于0的值
1、我们举一个栗子~~~:
var arr = new Array(6)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
arr[3] = "James"
arr[4] = "Adrew"
arr[5] = "Martin"
document.write(arr + "<br />")
document.write(arr.sort())
输出:
George,John,Thomas,James,Adrew,Martin
Adrew,George,James,John,Martin,Thomas
2、我们再举一个栗子~~~:
var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"
document.write(arr + "<br />")
document.write(arr.sort())
输出:
10,5,40,25,1000,1
请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:
function sortNumber(a, b) {
console.log(a);
console.log(b);
return a - b
}
var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"
document.write(arr + "<br />")
document.write(arr.sort(sortNumber))
这里可以看出,如果按照升序排列,那么方法为:
function sortNumber(a, b) {
return a - b
}
如果是按照降序排列则为:
function sortNumber(a, b) {
return b - a
}
当然如果想根据数组对象中的某个属性值进行排序呢?
sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,
其他部分代码与正常使用sort方法相同。
var arr = [
{ name: 'zopp', age: 0 },
{ name: 'gpp', age: 18 },
{ name: 'yjj', age: 8 }
];
function compare(property) {
return function(a, b) {
var value1 = a[property];
var value2 = b[property];
return value1 - value2;
}
}
console.log(JSON.stringify(arr.sort(compare('age'))))
输出:
[{"name":"zopp","age":0},{"name":"yjj","age":8},{"name":"gpp","age":18}]
如何根据参数不同,来确定是升序排列,还是降序排序呢?
var sortBy = function(attr, rev) {
//第二个参数没有传递 默认升序排列
if (rev == undefined) {
rev = 1;
} else {
rev = (rev) ? 1 : -1;
}
return function(a, b) {
a = a[attr];
b = b[attr];
if (a < b) {
return rev * -1;
}
if (a > b) {
return rev * 1;
}
return 0;
}
}
使用方式:
newArray.sort(sortBy('number', false))