代码实现
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var startIndex = 1; var endIndex = 3;
Array.prototype.mySplice = function () { var args = [].slice.call(arguments); var start = args.shift(); var end = args.shift(); var _this = this;
var changeThis = function (newArr) { _this.length = 0; for (let i = 0; i < newArr.length; i++) { _this.push(newArr[i]) } }
if (Object.prototype.toString.call(this).slice(8, -1) !== 'Array') return;
if (!start || start >= this.length) return;
if (typeof end === 'undefined') { var removes = this.slice(start); var newArr = this.slice(0, start); changeThis(newArr); return removes; }
if (args.length === 0) { var prevArr = this.slice(0, start); var nextArr = this.slice(start + end); var removes = this.slice(start, start + end); var newArr = prevArr.concat(nextArr); changeThis(newArr); return removes; }
var prevArr = this.slice(0, start); var nextArr = this.slice(start + end); var removes = this.slice(start, start + end); var newArr = prevArr.concat(args).concat(nextArr); changeThis(newArr); return removes; }
arr.mySplice(startIndex, endIndex, 77, 88, 99)
console.log(arr);
|
思路
首先判断this是否是数组
其次判断传递的参数是否合法
最后判断你传递了多少个参数
1.如果传递了1个参数
从这个位置开始,往后删除所有元素,并返回所删除的元素
步骤:
- slice只传递1个参数,可以从这个位置开始一直截取到数组的最后一位元素,而这个结果就是被删除的所有元素
- slice(0, n) 可以得到0-n之间的所有数组元素,而这个结果就是要保留的数组元素
- 因为this是数组,清空数组的方式可以用length=0,把this的值变为newArr的值就可以了
2.如果传递了2个参数
从这个位置开始,往后删除n个元素,并返回所删除的元素
步骤:
- slice(0, 起始位置) 可以得到前一段要保留的数据
- slice(起始位置,起始位置 + 删除个数) 可以得到你要删除的数据
- slice(起始位置 + 删除个数) 可以得到后一段要保留的数据
- 前一段数据+后一段数据 进行合并,就是我们想要的新数据
3.如果传递了2个以上的参数
因为不知道会传递多少个参数,所以通过arguments来取出所传递的所有参数
从这个位置开始,往后删除n个元素,并将其余元素添加至所删除的位置,然后返回所删除的元素
步骤:
- 通过数组方法shift可以取出start和end,并且改变args
- slice(0, 起始位置) 可以得到前一段要保留的数据
- slice(起始位置,起始位置 + 删除个数) 可以得到你要删除的数据
- slice(起始位置 + 删除个数) 可以得到后一段要保留的数据
- 前一段数据+剩余参数+后一段数据 进行合并,就是我们想要的新数据