求助:不使用Array.slice()实现自定义数组切片函数(JavaScript)
自定义JavaScript slice函数问题修复
你的需求
用JavaScript编写名为slice的函数,接收三个参数:整数数组arr、整数index、整数len,返回从index索引开始到len索引结束的新数组;若len大于数组长度,则截取到数组末尾,禁止使用内置Array.slice()函数。
你的代码问题
你写的代码存在几个明显问题:
from和to未用let/const声明,会成为全局变量,引发潜在bugto = Math.min(len);参数缺失,Math.min需要传入要比较的数值,这里没和数组长度做关联- 判断条件
!len逻辑错误,比如len=0时会触发“截取到末尾”的逻辑,但实际此时应该返回空数组 - 未处理
index超过数组长度的情况,这种场景下应直接返回空数组
修正后的代码
function slice(arr, index, len) { const result = []; // 修正起始索引:小于0则取0,超过数组长度直接返回空 const start = Math.max(index, 0); if (start >= arr.length) { return result; } // 修正结束索引:len超数组长度则取数组长度,同时确保结束索引不小于起始索引 const end = Math.min(len, arr.length); const actualEnd = Math.max(end, start); // 统一循环截取 for (let i = start; i < actualEnd; i++) { result.push(arr[i]); } return result; }
关键逻辑说明
- 起始索引处理:用
Math.max(index, 0)保证起始索引不会为负数,若起始索引已经大于等于数组长度,直接返回空数组,无需后续循环 - 结束索引处理:先用
Math.min(len, arr.length)确保不会超出数组范围,再用Math.max(end, start)避免出现结束索引小于起始索引的情况(比如len比index小的时候直接返回空) - 统一循环:把所有情况整合到一个循环里,不用拆分if-else,逻辑更简洁易懂
测试边界场景
slice([1,2,3,4], 1, 3)→ 返回[2,3](正常截取)slice([1,2,3,4], 2, 10)→ 返回[3,4](len超数组长度,截取到末尾)slice([1,2,3], 5, 10)→ 返回[](index超数组长度)slice([1,2,3], 1, 0)→ 返回[](len小于index)slice([1,2,3], -1, 2)→ 返回[1,2](index为负数,修正为0)
内容的提问来源于stack exchange,提问作者humanlyhuman
相关产品推荐
相关产品推荐

