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