js sort排序问题

排序出问题

// ***
this.tableData = res.data.sort(this.sortDesc('size'))
// ***
sortDesc (key) {
     return function (obj1, obj2) {
        const val1 = obj1[key]
        const val2 = obj2[key]
        if (val1 < val2) {
            return 1
        } else if (val1 > val2) {
            return -1
        } else {
            return 0
        }
    }
}

其中res.data为数组对象,size为字符串,例如‘3.12’
当整数仅有个位数时,排序正常:

js sort排序问题

但当出现十位数时,排序出现问题:
js sort排序问题

经排查,原因如下:

sort() 方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串UniCode码。

例一:按照字母顺序排序

js sort排序问题

例二:还是按照字母顺序排序

js sort排序问题

但这并不是我们需要的结果

如果要得到自己想要的结果,不管是升序还是降序,就需要提供比较函数了。该函数比较两个值的大小,然后返回一个用于说明这两个值的相对顺序的数字。

比较函数应该具有两个参数 a 和 b,其返回值如下:

若 a 小于 b,即 a - b 小于零,则返回一个小于零的值,数组将按照升序排列。

若 a 等于 b,则返回 0。

若 a 大于 b, 即 a - b 大于零,则返回一个大于零的值,数组将按照降序排列

js sort排序问题

按照数组对象中某个属性值进行排序

js sort排序问题

开头遇到的问题解决方法有两种:
1、修改比较方法

sortDesc (key) {
    return function (obj1, obj2) {
        const val1 = obj1[key]
        const val2 = obj2[key]
        if (parseFloat(val1) < parseFloat(val2)) {
            return 1
        } else if (parseFloat(val1) > parseFloat(val2)) {
            return -1
        } else {
            return 0
        }
    }
}

2、重写比较方法

sortDesc (key) {
    return function (obj1, obj2) {
        const val1 = obj1[key]
        const val2 = obj2[key]
        return val1-val2
}
上一篇:Flutter组件 底部ios弹框


下一篇:在Java中检查两个Integer是否相等