# 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'

slice 源码分析

# 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

  1. 首先拿到 arraylength,然后定义 index,此时会判断 是否从右到左,如果从右到左取 length,否则 取 -1
  2. while 循环拿到 index 更新后的值,这里也是判断了是否从右到左,从右到左,结束条件就是 length递减,否则就是 index 递增,且小于 length
  3. 调用 predicate 函数来处理数据,如果返回 false,则会结束循环,此时 index 已经被更新
  4. 最终会根据 isDrop 来决定返回的数组
    • 如果传入了 isDrop ,则会将遍历过的项移除,返回剩余的
    • 没有传入 isDrop 或者为假值,返回的则是遍历过的值组成的数组
  5. isDrop 为 真值,从右到左,返回的是 slice(0, index + 1)
  6. isDrop 为 真值,从左到右,返回的是 slice(index, length)
  7. isDrop 为 假值,从右到左,返回的是 slice(index + 1, length)
  8. 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)) // []