手动实现数组slice方法跟splice方法

var ary2 = [1, 2, 3, 5, 4, 53, 42];
        Array.prototype.slice2 = function (n, m) {
            var ary = [];
            n<(-this.length)?n=0:null;
            m>this.length?m=this.length:null;
            n < 0 ? n = this.length + n : n;
            m < 0 ? m = this.length + m : m;
            if (n===undefined) {
                return this;
            } else if (m===undefined) {
                for (var i = n; i < this.length; i++) {
                    ary.length += 1;
                    ary[ary.length - 1] = this[i];
                }
                return ary;
            } else {
                if (n > m) {
                    return ary;
                }
                for (var j = n; j < m; j++) {
                    ary.length += 1;
                    ary[ary.length - 1] = this[j];
                }
                return ary;
            }
        };

这个 是slice方法,思路是这样的,首先判断判断传递的参数是 过小或者过大,如果n比-this.length还要小,则让其变为0,如果m参数是否为负数,如果为负数,则将其转换为正数索引。
处理完参数,再将传递进来的参数分为三类:
1)没有传递参数,这种情况下,就返回this
2)只传递了一个参数,即为n
3)若传递了两个参数,传递两个参数时,要注意 ,如果m>n则返回[];
分别对这三种情况分类处理就OK了

//splice方法

    Array.prototype.mySplice2=function(x,y,z){
        var ary1 = [], ary2 = [], ary = [];
        var cur1 = x, cur2 = y;
        if (x===undefined) {
            return this;
        } else if (z===undefined) {
            for (var i = 0; i < x; i++) {
                ary1.length +=1;
                ary1[ary1.length - 1] = this[i];
            }
            for (var j = x + y; j < this.length; j++) {
                ary1.length +=1;
                ary1[ary1.length - 1] = this[j];
            }
            for(var k=x;k<x+y;k++){
                ary2.length +=1;
                ary2[ary2.length - 1] = this[k];
            }
            this.length=ary1.length;
            for(var m=0;m<ary1.length;m++){
                this[m]=ary1[m];
            }
            return ary2;
        }else{
            for (var i = 0; i < x; i++) {
                ary1.length +=1;
                ary1[ary1.length - 1] = this[i];
            }
            ary1[x]=z;
            for (var j = x + y; j < this.length; j++) {
                ary1.length +=1;
                ary1[ary1.length - 1] = this[j];
            }

            for(var k=x;k<x+y;k++){
                ary2.length +=1;
                ary2[ary2.length - 1] = this[k];
            }
            this.length=ary1.length;
            for(var m=0;m<ary1.length;m++){
                this[m]=ary1[m];
            }
            return ary2;
        }
    };

简单说下思路,就是将this分为三份,一份为截取的部分,一份为截取那部分的前面部分,一份为截取那部分的后面部分,将截取的部分返回回去,将剩下两部分拼接,并将this改变为这拼接的两部分。

//splice的第二种方法

    Array.prototype.mySplice = function (x, y, z) {
        var ary1 = [];
        if(x===undefined){
            return this
        }else if(z===undefined){
            for(var k=x;k<x+y;k++){
                ary1.length+=1;
                ary1[ary1.length-1]=this[k];
            }
            for(var i=0;i<y;i++){
                for(var j=x;j<this.length-1;j++){
                    this[j]=this[j+1];
                }
                this.length--;
            };
            return ary1;
        }else if(x==0){
            this.length+=1;
            this[this.length-1]=z;
            for(var i=this.length-1;i>0;i--){
                var temp=this[i];
                this[i]=this[i-1];
                this[i-1]=temp;
            }
            return ary1;
        }
        else{
            for(var k=x;k<x+y;k++){
                ary1.length+=1;
                ary1[ary1.length-1]=this[k];
            };
            for(var i=0;i<y;i++){
                for(var j=x+1;j<this.length-1;j++){
                    this[j]=this[j+1];
                    console.log(this);
                }
                this.length--;
            }
            this[x]=z;
            return ary1;
        }
    }

思路:通过循环 将后面的元素移动到前面来,把要删除的覆盖掉,然后再将末尾的删除。不过要现将截取的那部分保存下来后,再进行上述操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值