当前位置:首页 > IT技术 > Web编程 > 正文

手写一个splice js
2021-09-16 11:40:54

先来介绍一下什么是splice

splice == Array.prototype.splice

如介绍,是数组通用方法

以下是介绍

定义和用法

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

注释:该方法会改变原始数组。

语法

arrayObject.splice(index,howmany,item1,.....,itemX)

参数 描述
index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX 可选。向数组添加的新项目

现在献上手写splice代码

Array.prototype.mySplice = (function() {
    let _this

    function handlerType(value) {
        // 处理数据类型,看是否为数字
        return /^[+-]?(0|([1-9]d*))(.d+)?$/g.test(String(value))
    }

    function handlerIndex(value) {
        function _handler(value) {
            return Math.max(0, value + _this.length)
        }
        value = ~~value
            // 处理索引,如果大于等于0取本身,反之说明为负值,取反方向,数组长度加本身,反作用取索引
        return value >= 0 ? value : _handler(value)
    }

    function handlerCount(value) {
        // 如果个数比长度还大,将总长度赋值给个数
        return Math.min(Math.floor(value), _this.length)
    }
    return function(index, count, ...addArr) {
        _this = this
        index = Number(handlerType(index) ? handlerIndex(index) : 0) //准备删除的位置
        count = Number(handlerType(count) ? handlerCount(count) : 0) //删除的个数
        count = Math.min(this.length - index, count) //如果删除的个数大于该索引之后的总长度,取之后的总长度
        count = Math.max(count, 0)

        let delIndexArr = [] //删除数组的索引
        let result = [] //返回的数组
        for (let i = index; i < index + count; i++) {
            delIndexArr.push(i)
        }
        let finishArr = [] //存放处理之后的数组
            // 把索引之前的原数组成员全放到新数组里去
        this.forEach((im, idx) => {
                if (idx < index) {
                    finishArr.push(im)
                }
            })
            // 处理返回值
        delIndexArr.forEach((im) => {
                result.push(this[im])
            })
            // 把用户输入需要添加的元素放到新数组里去
        for (let i = 0; i < addArr.length; i++) {
            finishArr.push(addArr[i])
        }
        // 把添加之后,原数组的剩余成员,全部添加到新数组
        for (let i = index + count; i < this.length; i++) {
            finishArr.push(this[i])
        }
        // 将新数组深拷贝给原数组
        this.length = finishArr.length
        for (let i = 0; i < this.length; i++) {
            this[i] = finishArr[i]
        }
        return result
    }
})()
let arr = ['first', 'second', 'third']
let arr2 = [1, 2, 3, 4, 5];
console.log(arr2.splice(-20, 1, 10)) //1
console.log(arr2) //[10,2,3,4,5]
console.log(arr.mySplice(2, 1)) //[third]
console.log(arr) //[first,second]

 

本文摘自 :https://blog.51cto.com/u

开通会员,享受整站包年服务立即开通 >