You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:不使用Array.slice()实现自定义数组切片函数(JavaScript)

自定义JavaScript slice函数问题修复

你的需求

用JavaScript编写名为slice的函数,接收三个参数:整数数组arr、整数index、整数len,返回从index索引开始到len索引结束的新数组;若len大于数组长度,则截取到数组末尾,禁止使用内置Array.slice()函数。

你的代码问题

你写的代码存在几个明显问题:

  • from和to未用let/const声明,会成为全局变量,引发潜在bug
  • to = 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;
}

关键逻辑说明

  1. 起始索引处理:用Math.max(index, 0)保证起始索引不会为负数,若起始索引已经大于等于数组长度,直接返回空数组,无需后续循环
  2. 结束索引处理:先用Math.min(len, arr.length)确保不会超出数组范围,再用Math.max(end, start)避免出现结束索引小于起始索引的情况(比如len比index小的时候直接返回空)
  3. 统一循环:把所有情况整合到一个循环里,不用拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:00:59