1.sort的用法
菜鸟教程:
sort() 方法用于对原数组的元素进行排序,默认是按照字符串方式。
排序顺序可以是字母或数字,并按升序或降序。
如果sort中不传入参数,默认排序顺序为按字母升序。
如果想要按照数字排序,则必须传入判断的回调函数。
回调函数有两个参数,分别是数组中相邻的两个元素,
如果回调函数返回值大于0,二者就会交换位置,实现升序,
如果函数返回值小于0,就不做操作。
sort会影响原数组
2.sort使用示例
const arr = [1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 100, 120, 140]
//默认按照字符串升序,即将数字转换成字符串之后再比较
console.log(arr.sort());//[1, 10, 100, 120,140, 2, 20, 3, 30, 4, 40, 5, 50, 60]
//a是arr[i] b是arr[i+1]
// 返回值是a-b 当a-b>0 即前项大于后项时,二者交换位置 大数值被移到了后面,否则顺序不变 最终实现升序
console.log(arr.sort((a, b) => a - b));//[1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 100, 120, 140]
//返回值是b-a 当后项大于前项时,二者交换顺序,否则顺序不变
console.log(arr.sort((a, b) => b - a));//[140, 120, 100, 60, 50, 40, 30, 20, 10, 5, 4, 3, 2, 1]
3.sort的实现
Array.prototype.mySort = function (cb) {
//如果数组只有一个元素 或者是空数组 不用排序,直接返回即可
if (this.length <= 1) return this
//判断是否传入了回调函数
if (cb === undefined) {
//默认根据字符串大小比较 我采用的是冒泡排序 默认是升序
for (let i = 0; i < this.length; i++) {
for (let j = 0; j < this.length - i - 1; j++) {
//将元素强制转换成字符串再比较,如果String(this[j]) > String(this[j + 1]),二者交换位置,否则保持原位置不变
[this[j], this[j + 1]] =
String(this[j]) > String(this[j + 1])
?
[this[j + 1], this[j]]
:
[this[j], this[j + 1]]
}
}
//如果传入了一个参数,并且参数是函数,根据函数返回值排序
} else if (cb instanceof Function) {
for (let i = 0; i < this.length; i++) {
for (let j = 0; j < this.length - i - 1; j++) {
//cb()>0 升序 cb() <0降序
//不再直接比较两项元素。而是通过将元素传入回调函数,获得的返回值进行排序
[this[j], this[j + 1]] = cb(this[j], this[j + 1]) > 0 ? [this[j + 1], this[j]] : [this[j], this[j + 1]]
}
}
//如果传入了参数,但是参数不是函数,抛出错误
} else {
throw new Error('参数必须是函数')
}
//返回排序之后的数组this
return this
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。