前言
最近做的移动端项目是与楼层相关的,用户选择时,为了更好的用户体验,需要将楼层按升序情况展示,由于后台返回的数组是字符串类型,JS默认的sort()方法是按照ASCII码进行排序的,所以会发现并没有得到预想的排序结果。琢磨了一番得出另外一种解决方法,仍然会调用sort方法,但是给出参数。具体代码如下文所示。
JS sort()方法原理及使用
sort() 方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串ASCII码。因为排序是按照字符串ASCII码的顺序进行排序的,所以首先应该把数组元素都转化成字符串(如有必要),以便进行比较。
语法: arrayObject.sort(sortby);
看一下示例,第一种只有一位数字的时候是可以正常排序的,但是当字符串有两位及以上时,并没有得到我们预期得到的结果,这是因为sort方法是默认根据ASCII码进行排序,所以我们需要对它做一些改变。
例子:
var arr = ['1', '4', '7', '3', '2'];
arr.sort();
==>['1', '2', '3', '4', '7']
var arr = ['12', '41', '71', '31', '2'];
arr.sort();
==>['12', '2', '31', '41', '71']
可以看出第二个例子并没有得到预想的从小到大的排序结果,因为它是按照第一个字符的ASCII码进行排序的。
升序
function sortArray(arr){
return arr.sort(function(a, b) {return a-b;});
}
降序
function sortArray(arr){
return arr.sort(function(a, b) {return b-a;});
}
根据数组里的某一个属性进行排序
var arr1 = [
{roomName: '1001', roomId: '33'},
{roomName: '1002', roomId: '321'},
{roomName: '1003', roomId: '312'},
]
function compare(prop) {
return function(a, b) {
var value1 = a[prop];
var value2 = b[prop];
return value1 - value2;
}
}
arr1.sort(compare('age'));
根据参数来确定是升序还是降序
function sortBy(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;
}
}