手動實現數組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;
        }
    }

思路:通過循環 將後面的元素移動到前面來,把要刪除的覆蓋掉,然後再將末尾的刪除。不過要現將截取的那部分保存下來後,再進行上述操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章