如果有个纯数字数组要用js排序:
代码:
var arr=[3,2,1,4,6,5];
document.writeln(arr.sort());
结果:1,2,3,4,5,6
可见,sort()按照升序排列,但当数组元素是大于1位的数字时:
代码:
var arr=[3,2,1,4,6,5,11,12,13,14,15];
document.writeln(arr.sort());
结果:1,11,12,13,14,15,2,3,4,5,6
既非升序也非降序,why?
因为元素是按照 ASCII 字符顺序进行升序排列。
sort()方法其实是可以带参数的(现实场景中几乎是必须要要带参数),参数为一个自定义函数名,且这个自定义函数默认有2个参数,分别代表每次排序比较时的两个数组项。自定义函数的返回值决定了,作为参数的2个数组项的排列顺序:
小于0,升序,a前b后,a<b
大于0,降序,a后b前,a>b
利用这个自定义函数可以让数组项按照需求来排序:
代码:
var arr=[3,2,1,4,6,5,11,12,13,14,15];
function fn(a,b) {
if(a<b){
return -1;
}else if(a>b){
return 1;
}else{
return 0
}
}
document.writeln(arr.sort(fn));
结果:1,2,3,4,5,6,11,12,13,14,15
由此我们实现了对1位以上数字的升序排序,上面方法稍作调整即可实现降序:
代码:
var arr=[3,2,1,4,6,5,11,12,13,14,15];
function fn(a,b) {
if(a>b){
return -1;
}else if(a<b){
return 1;
}else{
return 0
}
}
document.writeln(arr.sort(fn));
结果:15,14,13,12,11,6,5,4,3,2,1
上面的自定义方法if语句:
a>b
可不可以写成:
a-b>0
只做数字排序就行,非数字就垮了。
代码精简下,可以用三目运算符,等于0的情况基本可以不考虑:
var arr=[+5,+6,+3,-2,-1,-6,-3];
arr.sort(function(a,b){return a<b?1:-1});
arr.sort(function(a,b){return a>b?1:-1});
参考:http://my.oschina.net/u/727394/blog/367436
有时,数组对象不是简单的数字或字符串,而是一个对象,我们要依赖对象中的某个字段排序怎么办?
代码:
var data = [
{ name: "Tom", age: 22 },
{ name: "Peter", age: 21 },
{ name: "Lucy", age: 25}
];
function compare(propertyName) {
return function (object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value2 < value1) {
return -1;
}else if (value2 > value1) {
return 1;
}else {
return 0;
}
}
}
data.sort(compare("age"));
console.log(data);
结果:
用一个自定义函数返回一个函数的方式,我们的自定义方法接受了3个参数,而不是2个。此方法是网上找的,感觉真的很精巧。此方法也可以用三目运算符进一步简写:
function compare(propertyName) {
return function (object1, object2) {
return object1[propertyName]>object2[propertyName]?1:-1;
}
}
参考:http://my.oschina.net/code33/blog/384085
转载于:https://my.oschina.net/710409599/blog/404065
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109481.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...