手写实现数组的splice方法

五一小长假刚过去没多久,今个儿礼拜六,还需要补班。改了几个bug,然后也没什么其他事情,就想着封装个方法,实现和数组splice同样的功能。

相信开发过程中,经常会用到有关数组的方法,找到最适合场景的方法,不但可以提高我们的开发效率,还让我们的代码既干净又整洁,维护起来也非常的方便。这是鄙人好早之前整理的有关数组的一些常用的方法=>✋✋✋,有兴趣的小伙伴可以瞅一瞅。

好了,我们来说一说splice,他可以接受多个参数,一个两个三个甚至更多,把每个参数搞搞清楚,封装起来也就1234了。先了解下他的特点。

    {
        let arr = ['a','b','c','d'];
        // 1个参数
        let arr2 = arr.splice(1);  // arr = ['a'], arr2 = ['b','c','d']
        let arr2 = arr.splice(-1); // arr = ['a','b','c'], arr2 = ['d']
        let arr2 = arr.splice(10); // arr = ['a','b','c','d'], arr2 = []
        let arr2 = arr.splice(-10);// arr = [],arr2 = ['a','b','c','d']
        // 当为非负数时,arr会从所对应的下标开始截取,截取至最后一位,如果超出自身长度范围,则截取为空
        // 当为负数时,arr则会倒数至所对应的下标,然后截取至最后一位,当绝对值大于自身长度时,则从首位开始截取
    }

    {
        let arr = [1,2,3,4];
        // 两个参数
        let arr2 = arr.splice(1,1);     // arr = [1,3,4], arr2 = [2]
        let arr2 = arr.splice(1,10);    // arr = [1], arr2 = [2,3,4]
        let arr2 = arr.splice(-3,2);    // arr = [1,4], arr2 = [2,3]
        let arr2 = arr.splice(2,0);     // arr = [1,2,3,4], arr2 = []
        // 可以看出第二个参数代表的是截取的个数,具体要截取几位,如果从开始的下标开始截取,但自身长度不够的话,则会截取到最后一位
    }

    {
        let arr = [1,2,3,4];
        // 多个参数
        let arr2 = arr.splice(1,1,'aa');         // arr = [1, "aa", 3, 4], arr2 = [2]
        let arr2 = arr.splice(1,10,[123]);       // arr = [1,[123]], arr2 = [2,3,4]
        let arr2 = arr.splice(-3,2,'aa',123);    // arr = [1,'aa',123,4], arr2 = [2,3]
        let arr2 = arr.splice(2,0,{});           // arr = [1,2,{},3,4], arr2 = []
        // 当参数为多个时,从第三个参数起为添加项,添加的位置为前文下标的前面,如下标为1,则在下标0之后进行插入,下标为0,则从数组最开始进行插入
        // 当参数 a x n 都存在时,理解为 在下标为a的前面插入 n, 然后从a(包含a) 开始删除 x 个元素
    }

了解完splice的特点,咱们话不多说,开始疯~~

    Array.prototype.splice2 = function(start, num){
        const newAdd = [].slice.call(arguments, 2); // 新增项
        if (start < 0) {
            start = this.length + start;
            if(start < 0) start = 0;
        }

        let end;
        if (num <= 0) {
            end = start;
        } else if (!num) {
            end = this.length;
        } else {
            end = start + num;
            if(end > this.length) end = this.length;
        }

        let returnRrr = [];   // 截取项 == 返回值
        let beforeArr = [];   // 截取部分之前的
        let afterArr = [];    // 截取部分之后的
        for (let i = 0; i < this.length; i++) {
            if (i < start ) {
                beforeArr.push(this[i])
            }
            if (i + 1 > end) {
                afterArr.push(this[i])
            }
            if(i >= start && i < end){
                returnRrr.push(this[i])
            }
        }
        this.length = 0;
        [...beforeArr,...newAdd,...afterArr].forEach((item,idx) => this[idx] = item);
        return returnRrr
    }

自己试了试,splice的一些功能基本都已实现了,这里并没有考虑一些特殊和极端的情况,比如参数不是数字,一个是数字一个不是数字等情况,一是没时间二是感觉没必要。我写的这个代码还不够简洁明了,希望有兴趣的小伙伴也可以自己尝试着去实现splice这个功能,一起交流学习。

这个函数我有用到slice这个方法,不用的话也是一样可以实现,因为在此之前我也有去实现slice等数组的其他方法,比起splice,slice就是小儿科。至于为什么,大伙尝试一下就知道了。

有啥问题,还请各位大佬多多指教。
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值