ES6数组字符串取差集

前言

最近做的移动端项目是与楼层相关的,用户选择时,为了更好的用户体验,需要将楼层按升序情况展示,由于后台返回的数组是字符串类型,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;
    }
}