数组的slice与splice方法实现

8次阅读

共计 1772 个字符,预计需要花费 5 分钟才能阅读完成。

1.slice 的用法

slice() 方法可从已有的数组中返回选定的元素。
slice()方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
注意:
1.slice(start,end) 方法不会改变原始数组
2.start 是开始复制的起始位置,默认为 0,end 是结束位置,默认为数组长度
3. 如果传入的参数是负数 代表从后往前数 比如 - 1 指的是最后一项元素
4.slice 是浅拷贝

2.slice 使用示例

    const arr = [1, 2, 3, 4, 5]
    console.log(arr.slice());//[1, 2, 3, 4, 5]
    console.log(arr.slice(8));//[]
    console.log(arr.slice(-1));//[5]
    console.log(arr.slice(-3, -1));//[3,4]

3.slice 的实现

    Array.prototype.mySlice = function (start = 0, end = this.length) {
        // 声明一个空数组,作为复制后返回值
        const res = [];
        // 如果起始位置越界,返回空数组
        if (start >= this.length) return res
        // 处理 start 和 end 小于 0 的情况
        if (start < 0) {start = start + this.length < 0 ? 0 : start + this.length;}
        if (end < 0) {end = end + this.length < 0 ? 0 : end + this.length;}
        // 复制 start 至 end 的元素到 res 中 包括 arr[start] 不包括 arr[end]
        for (let i = start; i < end; i++) {res.push(this[i])
        }
        return res
    }

4.splice 的用法

splice() 方法用于添加、修改或删除数组中的元素。
返回值是删除掉的数组元素 如果删除 0 个 返回空数组
注意:这种方法会改变原始数组。
splice 方法的参数为 (delIndex,deleteCount,insert1,insert2…)
delIndex 是要删除的元素下标,为负时,处理与 slice 相同,大于等于数组长度时,为数组长度
deleteCount 默认为 0,是要从 delIndex 处删除的元素个数,这些被删除的元素将作为 splice 函数的返回值
之后的所有参数 insert1,insert2… 都是从 delIndex 处插入到原始数组的元素

5.splice 的实现

    Array.prototype.mySplice = function (delIndex, count = 0, ...inserts) {
        // 如果没有传入要插入的元素,将 inserts 设为空数组
        inserts = inserts || []
        // 判断 delIndex
        if (delIndex >= this.length) delIndex = this.length
        if (delIndex < 0) {delIndex = delIndex + this.length < 0 ? 0 : delIndex + this.length;}
        // 获取返回值
        const res = this.slice(delIndex, delIndex + count);
        // 获取在 delIndex 处删除到某些元素,并插入新元素之后的新数组 This
        const This = [...this.slice(0, delIndex), ...inserts, ...this.slice(delIndex + count)]
        /* this 替换处理开始  使用 This 替换旧的原始数组 this  */
        // 当 this 长度大于 This 时,无法全部覆盖,先将 this 多出的的部分删除
        while (this.length > This.length) {
            // 删除 this 的最后一个元素,一直到 this 长度和 This 长度相同时,结束循环
            this.pop()}
        //delIndex 之前 this 的元素与 This 相同,从 delIndex 之后全部重新赋值,使用 This 中的元素覆盖 this 的元素,达到改变 this 的效果
        for (let i = delIndex; i < This.length; i++) {this[i] = This[i]
        }
        /* this 替换完毕 */
        // 返回被删除的元素
        return res;
    }
仅为个人理解,如有错谬,欢迎指正。
如果对您有所帮助,请您点个赞吧!
正文完
 0