JavaScript 中的 sort 排序问题
在 JavaScript 中,以下两种写法是等价的:
写法一:
let fruits = ["banana", "apple", "cherry", "Apple"]
fruits.sort()
console.log(fruits) // ["Apple", "apple", "banana", "cherry"]
写法二:
let fruits = ["banana", "apple", "cherry", "Apple"]
fruits.sort((a, b) => {
return a > b ? 1 : -1
})
console.log(fruits)
sort 排序基本原理
因为 sort 函数默认是字符的 ASCII 码升序排列的。
比如:
'A'.charCode() // 65
'a'.charCode() // 97
'b'.charCode() // 98
因此如果是10和2排序的话,其实是'10'和'2'排序,'1'.charCode() 为 49,'2'.charCode() 为 50,导致出现 2 比 10 大,出现在 10 后面。
比如下面的代码:
let nums = [3, 10, 2]
nums.sort()
console.log('nums') // [10, 2, 3]
基础
那么问题来了,如果我想实现以下数组按照 appName 字典顺序降序排列怎么办?
let apps = [
['chrome', { cpu: 30, memory: 50 }],
['edge', { cpu: 30, memory: 20 }],
['firefox', { cpu: 80, memory: 90 }],
['safari', { cpu: 10, memory: 50 }],
]
注:chrome、edge 这些是 appName
欢迎在评论区解答。
进阶
再扩展一下,给定一个数组 sortRules,这个数组只能取 cpu 和 memory 两个值,可能是 0、1、2 个。
比如 sortRules 可能是:[]、['cpu']、['memory', 'cpu']、['cpu', 'memory'] 等。
请实现先按照给定的 sortRules 的值依次升序排序,再按照 appName 降序排序。
比如 sortRules 是 ['cpu'],则排序结果是:
let apps = [
['safari', { cpu: 10, memory: 50 }],
['chrome', { cpu: 30, memory: 50 }],
['edge', { cpu: 30, memory: 20 }],
['firefox', { cpu: 80, memory: 90 }],
]
比如 sortRules 是 ['cpu', 'memory'],则排序结果是:
let apps = [
['safari', { cpu: 10, memory: 50 }],
['edge', { cpu: 30, memory: 20 }],
['chrome', { cpu: 30, memory: 50 }],
['firefox', { cpu: 80, memory: 90 }],
]
欢迎在评论区回复~