先来介绍一下什么是splice
splice == Array.prototype.splice
如介绍,是数组通用方法
以下是介绍
定义和用法
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
注释:该方法会改变原始数组。
语法
arrayObject.splice(index,howmany,item1,.....,itemX)
参数 | 描述 |
---|---|
index | 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 |
howmany | 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 |
item1, ..., itemX | 可选。向数组添加的新项目 |
现在献上手写splice代码
Array.prototype.mySplice = (function() {
let _this
function handlerType(value) {
// 处理数据类型,看是否为数字
return /^[+-]?(0|([1-9]d*))(.d+)?$/g.test(String(value))
}
function handlerIndex(value) {
function _handler(value) {
return Math.max(0, value + _this.length)
}
value = ~~value
// 处理索引,如果大于等于0取本身,反之说明为负值,取反方向,数组长度加本身,反作用取索引
return value >= 0 ? value : _handler(value)
}
function handlerCount(value) {
// 如果个数比长度还大,将总长度赋值给个数
return Math.min(Math.floor(value), _this.length)
}
return function(index, count, ...addArr) {
_this = this
index = Number(handlerType(index) ? handlerIndex(index) : 0) //准备删除的位置
count = Number(handlerType(count) ? handlerCount(count) : 0) //删除的个数
count = Math.min(this.length - index, count) //如果删除的个数大于该索引之后的总长度,取之后的总长度
count = Math.max(count, 0)
let delIndexArr = [] //删除数组的索引
let result = [] //返回的数组
for (let i = index; i < index + count; i++) {
delIndexArr.push(i)
}
let finishArr = [] //存放处理之后的数组
// 把索引之前的原数组成员全放到新数组里去
this.forEach((im, idx) => {
if (idx < index) {
finishArr.push(im)
}
})
// 处理返回值
delIndexArr.forEach((im) => {
result.push(this[im])
})
// 把用户输入需要添加的元素放到新数组里去
for (let i = 0; i < addArr.length; i++) {
finishArr.push(addArr[i])
}
// 把添加之后,原数组的剩余成员,全部添加到新数组
for (let i = index + count; i < this.length; i++) {
finishArr.push(this[i])
}
// 将新数组深拷贝给原数组
this.length = finishArr.length
for (let i = 0; i < this.length; i++) {
this[i] = finishArr[i]
}
return result
}
})()
let arr = ['first', 'second', 'third']
let arr2 = [1, 2, 3, 4, 5];
console.log(arr2.splice(-20, 1, 10)) //1
console.log(arr2) //[10,2,3,4,5]
console.log(arr.mySplice(2, 1)) //[third]
console.log(arr) //[first,second]
本文摘自 :https://blog.51cto.com/u