五一小长假刚过去没多久,今个儿礼拜六,还需要补班。改了几个bug,然后也没什么其他事情,就想着封装个方法,实现和数组splice同样的功能。
相信开发过程中,经常会用到有关数组的方法,找到最适合场景的方法,不但可以提高我们的开发效率,还让我们的代码既干净又整洁,维护起来也非常的方便。这是鄙人好早之前整理的有关数组的一些常用的方法=>✋✋✋,有兴趣的小伙伴可以瞅一瞅。
好了,我们来说一说splice,他可以接受多个参数,一个两个三个甚至更多,把每个参数搞搞清楚,封装起来也就1234了。先了解下他的特点。
{
let arr = ['a','b','c','d'];
// 1个参数
let arr2 = arr.splice(1); // arr = ['a'], arr2 = ['b','c','d']
let arr2 = arr.splice(-1); // arr = ['a','b','c'], arr2 = ['d']
let arr2 = arr.splice(10); // arr = ['a','b','c','d'], arr2 = []
let arr2 = arr.splice(-10);// arr = [],arr2 = ['a','b','c','d']
// 当为非负数时,arr会从所对应的下标开始截取,截取至最后一位,如果超出自身长度范围,则截取为空
// 当为负数时,arr则会倒数至所对应的下标,然后截取至最后一位,当绝对值大于自身长度时,则从首位开始截取
}
{
let arr = [1,2,3,4];
// 两个参数
let arr2 = arr.splice(1,1); // arr = [1,3,4], arr2 = [2]
let arr2 = arr.splice(1,10); // arr = [1], arr2 = [2,3,4]
let arr2 = arr.splice(-3,2); // arr = [1,4], arr2 = [2,3]
let arr2 = arr.splice(2,0); // arr = [1,2,3,4], arr2 = []
// 可以看出第二个参数代表的是截取的个数,具体要截取几位,如果从开始的下标开始截取,但自身长度不够的话,则会截取到最后一位
}
{
let arr = [1,2,3,4];
// 多个参数
let arr2 = arr.splice(1,1,'aa'); // arr = [1, "aa", 3, 4], arr2 = [2]
let arr2 = arr.splice(1,10,[123]); // arr = [1,[123]], arr2 = [2,3,4]
let arr2 = arr.splice(-3,2,'aa',123); // arr = [1,'aa',123,4], arr2 = [2,3]
let arr2 = arr.splice(2,0,{}); // arr = [1,2,{},3,4], arr2 = []
// 当参数为多个时,从第三个参数起为添加项,添加的位置为前文下标的前面,如下标为1,则在下标0之后进行插入,下标为0,则从数组最开始进行插入
// 当参数 a x n 都存在时,理解为 在下标为a的前面插入 n, 然后从a(包含a) 开始删除 x 个元素
}
了解完splice的特点,咱们话不多说,开始疯~~
Array.prototype.splice2 = function(start, num){
const newAdd = [].slice.call(arguments, 2); // 新增项
if (start < 0) {
start = this.length + start;
if(start < 0) start = 0;
}
let end;
if (num <= 0) {
end = start;
} else if (!num) {
end = this.length;
} else {
end = start + num;
if(end > this.length) end = this.length;
}
let returnRrr = []; // 截取项 == 返回值
let beforeArr = []; // 截取部分之前的
let afterArr = []; // 截取部分之后的
for (let i = 0; i < this.length; i++) {
if (i < start ) {
beforeArr.push(this[i])
}
if (i + 1 > end) {
afterArr.push(this[i])
}
if(i >= start && i < end){
returnRrr.push(this[i])
}
}
this.length = 0;
[...beforeArr,...newAdd,...afterArr].forEach((item,idx) => this[idx] = item);
return returnRrr
}
自己试了试,splice的一些功能基本都已实现了,这里并没有考虑一些特殊和极端的情况,比如参数不是数字,一个是数字一个不是数字等情况,一是没时间二是感觉没必要。我写的这个代码还不够简洁明了,希望有兴趣的小伙伴也可以自己尝试着去实现splice这个功能,一起交流学习。
这个函数我有用到slice这个方法,不用的话也是一样可以实现,因为在此之前我也有去实现slice等数组的其他方法,比起splice,slice就是小儿科。至于为什么,大伙尝试一下就知道了。
有啥问题,还请各位大佬多多指教。