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