collection/reduce.jsjavascript
import { entries } from '../_internal/iteratee'

/**
 * 依次将集合元素归并为一个结果值。
 * @function reduce
 * @memberof module:collection
 * @param {Array|Object} collection 要遍历的数组或普通对象
 * @param {Function} reducer 归并函数,参数为累计值、当前值、键和原集合
 * @param {*} [initialValue] 初始累计值;省略时使用第一个元素
 * @returns {*} 归并结果;空集合且省略初始值时返回 undefined
 * @throws {TypeError} 集合或归并函数类型不正确时抛出
 */
function reduce(collection, reducer, initialValue) {
  if (typeof reducer !== 'function') throw new TypeError('reducer must be a function')
  const items = entries(collection)
  if (items.length === 0 && arguments.length < 3) return undefined
  let index = 0
  let result
  if (arguments.length >= 3) result = initialValue
  else result = items[index++][1]
  for (; index < items.length; index += 1) {
    const [key, value] = items[index]
    result = reducer(result, value, key, collection)
  }
  return result
}

export default reduce