# baseEach
# Description
baseEach 和 forEach 基本一致,不同在于 baseEach 可以遍历对象
# Params
(collection, iteratee)
{Array|Object} collection
iteratee - 每次迭代调用的函数
# Return
{Array|Object}
# Depend
import baseForOwn from './baseForOwn.js'
import isArrayLike from '../isArrayLike.js'
# Code
function baseEach(collection, iteratee) {
if (collection == null) {
return collection
}
if (!isArrayLike(collection)) {
return baseForOwn(collection, iteratee)
}
const length = collection.length
const iterable = Object(collection)
let index = -1
while (++index < length) {
if (iteratee(iterable[index], index, iterable) === false) {
break
}
}
return collection
}
# Analyze
- 判断如果传入的
collection
为null
或undefined
,直接返回collection
- 如果传入的
collection
不是一个类数组(不是一个函数,并且length
是个 大于等于 0 小于或等于 9007199254740991 的整数)则调用baseForOwn
进行迭代处理 - 如果传入
collection
为类数组,首先获取到 length 然后进行遍历即可 - 和
Array.prototype.forEach
不同的是,如果iteratee
返回false
会退出迭代,并且同时也会处理 稀疏数组
# Remark
- Object () 构造函数 (opens new window) 将给定的值包装为一个新对象
- 如果给定的值是 null 或 undefined, 它会创建并返回一个空对象。
- 否则,它将返回一个和给定的值相对应的类型的对象。
- 如果给定值是一个已经存在的对象,则会返回这个已经存在的值(相同地址)。
# Example
const a = {a: 1, b: 2, c: 3}
const b = [1,2,3]
let c = 0;
let d = c;
baseEach(a, (val) => {c+=val})
baseEach(b, (val) => {d+=val})
console.log(c) // 6
console.log(d) // 6