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