乐趣区

数组sort方法的实现

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
        }
仅为个人理解,如有错谬,欢迎指正。
如果对您有所帮助,请您点个赞吧!
退出移动版