/* splic : 插入,删除,替换
start :开始删除的索引位置,
+ 缺省时返回新的空数组,
+ 开始位置大于数组长度,则等于数组长度 ==> 删除时没得删,添加时避免传入undefined
+ 为负数: 负数加数组长度 > 0 ? 相加后的值 : 0
deletContent: 删除的个数 ,
+ 缺省时,删除到数组的末尾
+ 小数,向下取整 ,非数字或者负数 ,取零
arg: 从start位置开始插入的内容
返回一个新数组: 里面的元素是被删除的数组元素
改变原数组
*/
let arrSplic = [1, 2, , 3, 4]
// console.log(arrSplic[2]) // undefined
let arrSplic_copy = [1, 2, , 3, 4]
// let arr = []
// arr[0] = arrSplic[2]
// console.log(arr, arrSplic.splice(5, 0, 1, 2))
// console.log(2 in arrSplic, arrSplic)
// 重构splice
function arraySplic(arr, start, deleteCount, ...arg) {
if (!arr || arr.constructor !== Array) throw new TypeError(arr + ' is not an Array')
let deleteArray = []
if (start === undefined) return deleteArray
if (deleteCount === undefined) deleteCount = arr.length
start = ~~start // 向下取整,非数字赋值为0
deleteCount = ~~deleteCount
if (start < 0) start = start + arr.length < 0 ? 0 : start + arr.length
if (start > arr.length) start = arr.length // 为添加做准备
if (deleteCount < 0) deleteCount = 0
let len = start + deleteCount < arr.length ? deleteCount : arr.length - start // 实际删除的个数
// 删除元素
for (let i = start; i < arr.length; i++) {
if (i < start + len) {
if( i in arr) deleteArray[deleteArray.length] = arr[i]
else {
deleteArray.length++
}
}
if (i + len in arr) arr[i] = arr[i + len]
else {
// 此处是为了避免数组中的空元素在移动时被换成undefin
arr[i] = null
delete arr[i]
}
}
arr.length -= len
// 插入元素 , 从后向前
for (let j = arr.length + arg.length - 1; j >= start; j--) {
if (j >= start + arg.length) {
if (j - arg.length in arr) arr[j] = arr[j - arg.length]
else {
arr[j] = null
delete arr[j]
}
}
else arr[j] = arg[j - start]
}
return deleteArray
}
console.log(arrSplic_copy.splice(2, 1), arrSplic_copy)
console.log(arraySplic(arrSplic, 2, 1), arrSplic)
踢被子感冒了,好难受😩