功能说明
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。原始数组长度和内容不应改变。