# baseWhile
# Description
baseWhile 是实现 dropWhile 和 takeWhile 的工具函数。
# Params
(array, predicate, isDrop, fromRight)
{Array} array - 要查询的数组。
{Function} predicate - 每次迭代调用的函数。
{boolean} [isDrop] - 指定删除元素而不是获取元素。
{boolean} [fromRight] - 指定从右到左的迭代
# Return
Array
# Depend
import slice from '../slice.js'
# Code
function baseWhile(array, predicate, isDrop, fromRight) {
const { length } = array
let index = fromRight ? length : -1
while ((fromRight ? index-- : ++index < length) &&
predicate(array[index], index, array)) {}
return isDrop
? slice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
: slice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index))
}
# Analyze
- 首先拿到
array
的length
,然后定义index
,此时会判断 是否从右到左,如果从右到左取length
,否则 取 -1 while
循环拿到index
更新后的值,这里也是判断了是否从右到左,从右到左,结束条件就是 length递减,否则就是index
递增,且小于length
- 调用
predicate
函数来处理数据,如果返回false
,则会结束循环,此时index
已经被更新 - 最终会根据
isDrop
来决定返回的数组- 如果传入了
isDrop
,则会将遍历过的项移除,返回剩余的 - 没有传入
isDrop
或者为假值,返回的则是遍历过的值组成的数组
- 如果传入了
- isDrop 为 真值,从右到左,返回的是
slice(0, index + 1)
- isDrop 为 真值,从左到右,返回的是
slice(index, length)
- isDrop 为 假值,从右到左,返回的是
slice(index + 1, length)
- isDrop 为 假值,从左到右,返回的是
slice(0, index)
# Remark
slice 返回的是按照索引截取的数组, slice([0,1,2,3], 1, 3) => [1,2]
# Example
const arr = [1,2,3,4,5,6]
console.log(baseWhile(arr, (val) => val < 4, true, false)) // [ 4, 5, 6 ]
console.log(baseWhile(arr, (val) => val < 4, true, true)) // [ 1, 2, 3, 4, 5, 6 ]
console.log(baseWhile(arr, (val) => val < 4, false, false)) // [ 1, 2, 3 ]
console.log(baseWhile(arr, (val) => val < 4, false, true)) // []
← baseValues baseXor →