Skip to content

sort()排序以及多个属性数组对象排序(按条件排序)

原生排序

javascript
let arr = [5, 2, 1, 4, 9, 8]
for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            let num = arr[j]
            arr[j] = arr[j + 1]
            arr[j + 1] = num
        }
    }
}
console.log(arr)

ES6排序

sort() 方法是最强大的数组方法之一。 默认排序顺序为按字母升序。 使用数字排序,你必须通过一个函数作为参数来调用。 比较函数两个参数a和b,a-b 升序,返回b-a 降序 注意: 这种方法会改变原始数组!

javascript
let arr = [5, 2, 1, 4, 9, 8]
// 升序
arr.sort(function (a, b) {
    return a - b
})
console.log(arr)
// 结果 1,2,4,5,8,9


// 降序
arr.sort(function (a, b) {
    return b - a
})
console.log(arr)
// 结果 9,8,5,4,2,1

根据数组中的某个属性排序

javascript
let arr_choice = [{ id: 1 }, { id: 3 }, { id: 2 }, { id: 8 }, { id: 6 }, { id: 4 }]
// 升序
arr_choice.sort(function (a, b) {
    return b.id - a.id
})
console.log(arr_choice)
// 结果:[{"id":1},{"id":2},{"id":3},{"id":4},{"id":6},{"id":8}]


// 降序
arr_choice.sort(function (a, b) {
    return b.id - a.id
})
console.log(arr_choice)
// 结果:[{"id":8},{"id":6},{"id":4},{"id":3},{"id":2},{"id":1}]

根据多个属性排序

javascript
let arr_multi = [{ id: 1, age: 10 }, { id: 3, age: 5 }, { id: 2, age: 6 }, { id: 8, age: 8 }, { id: 6, age: 5 }, { id: 4, age: 5 }]
// 升序
arr_multi.sort(function (a, b) {
    // 默认根据年龄排序,年龄相同则按照id排序
    if (a.age == b.age) {
        return a.id - b.id
    }
    return a.age - b.age
})
console.log(arr_multi)
// 结果:[{"id":3,"age":5},{"id":4,"age":5},{"id":6,"age":5},{"id":2,"age":6},{"id":8,"age":8},{"id":1,"age":10}]


// 降序
arr_multi.sort(function (a, b) {
    // 默认根据年龄排序,相同则按照id排序
    if (a.age == b.age) {
        return b.id - a.id
    }
    return b.age - a.age
})
console.log(arr_multi)
// 结果:[{"id":1,"age":10},{"id":8,"age":8},{"id":2,"age":6},{"id":6,"age":5},{"id":4,"age":5},{"id":3,"age":5}]

sort排序若碰到排序值为undefined的情况下,sort会终止处理,此时我们需要做排序的兼容,考虑各种可能会发生的情况

javascript
let a = [
    { id: 0, label: '000' },
    { id: 2, label: '222' },
    { label: '333' },
    { label: '444' },
    { id: 1, label: '111' }
]

a.sort((a, b) => {
    // 判断排序的对象是否存在,普通判断中,数字0 会隐式转换为false,这里需要做兼容
    // a和b都是undefined则相等
    if ((a.id != 0 && !a.id) && (b.id != 0 && !b.id)) return 0
    // a.id不是0 且 a.id是undefined则a被排在b之后
    if (a.id != 0 && !a.id) return 1
    // b.id不是0 且 b.id是undefined则b被排在a之后
    if (b.id != 0 && !b.id) return -1
    return a.id - b.id
})
console.log(a)

基于 MIT 许可发布