# differenceBy
# Description
这个方法类似 difference ,除了它接受一个 iteratee (注:迭代器), 调用 array 和 values 中的每个元素以产生比较的标准。 结果值是从第一数组中选择。iteratee 会调用一个参数:(value)。(注:首先使用迭代器分别迭代 array 和 values 中的每个元素,返回的值作为比较值)。
# Params
(array, ...values)
# Return
Array
# Depend
import baseDifference from './.internal/baseDifference.js'
import baseFlatten from './.internal/baseFlatten.js'
import isArrayLikeObject from './isArrayLikeObject.js'
import last from './last.js'
baseDifference 源码分析
baseFlatten 源码分析
isArrayLikeObject 源码分析
last 源码分析
# Code
function differenceBy(array, ...values) {
let iteratee = last(values)
if (isArrayLikeObject(iteratee)) {
iteratee = undefined
}
return isArrayLikeObject(array)
? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), iteratee)
: []
}
# Analyze
- 首先通过
last
拿到values
的最后一个元素,定义为iteratee
- 判断如果
iteratee
为数组或类数组,则将iteratee
置为undefined
- 接着就和 difference 处理逻辑一致了,不同的是
baseDifference
传入了 第三个参数iteratee
函数(每个元素调用的迭代器)
# Remark
一开始的判断这里,简单来说其实可以只判断 typeof last(values)
是否为 function
即可
也就是
let iteratee = last(values)
iteratee = typeof iteratee === 'function' ? iteratee : undefined
# Example
console.log(differenceBy([1,2,3,4], 1, [3], [4], 2, (v) => ++v)) // [ 1, 2 ]