← 中文资源

简体中文版本

takeWhile 与 dropWhile 数组辅助函数

从数组开头按谓词取元素或丢弃元素,在首次失败后停止测试,并且不修改原数组。

阅读英文原文

功能说明

takeWhile 与 dropWhile 是常见的函数式数组操作,但手写循环容易出现边界错误。该实现从数组开头测试谓词,takeWhile 收集连续通过的元素,dropWhile 返回第一个失败位置之后的切片。两者都只处理前缀,不会跳过中间失败后再次通过的元素。

关键代码

两个函数都先校验数组和谓词函数。takeWhile 在首次失败时 break,避免继续调用谓词;dropWhile 用 while 找到第一个失败索引,再用 slice 返回剩余部分,不修改原数组。对于空数组,两者都返回空数组。

export function takeWhile(items, predicate) {
  const result = [];
  for (const item of items) {
    if (!predicate(item)) break;
    result.push(item);
  }
  return result;
}

使用注意

谓词应无副作用,因为两个函数在首次失败后都不再调用它。dropWhile 在全部元素都通过时返回空数组,takeWhile 则返回全部元素。返回的是浅拷贝,元素本身仍共享引用。稀疏数组中的空槽会被当作 undefined 传给谓词。

验证方式

断言 takeWhile([1, 2, 3, 1], (n) => n < 3) 返回 [1, 2],dropWhile 返回 [3, 1]。全部通过时 takeWhile 返回全部、dropWhile 返回空数组。空数组返回空数组。非数组或非函数参数抛 TypeError。原始数组长度和内容不应改变。