牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2015-08-12 投稿人: 浏览次数:579
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;
        }
    }

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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。