# unionBy
# Description
这个方法类似 union ,除了它接受一个 iteratee (迭代函数),调用每一个数组(array)的每个元素以产生唯一性计算的标准。iteratee 会传入一个参数:(value)。
# Params
(...arrays)
# Return
Array
# Depend
import baseFlatten from './.internal/baseFlatten.js'
import baseUniq from './.internal/baseUniq.js'
import isArrayLikeObject from './isArrayLikeObject.js'
import last from './last.js'
baseFlatten 源码分析
baseUniq 源码分析
isArrayLikeObject 源码分析
last 源码分析
# Code
function unionBy(...arrays) {
let iteratee = last(arrays)
if (isArrayLikeObject(iteratee)) {
iteratee = undefined
}
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), iteratee)
}
# Analyze
这里取出了 arrays
的最后一个参数,当做 iteratee
, 然后又判断了 iteratee
, 如果是一个类数组,那么就将其置为 undefined
然后使用 baseFlatten
展开数组,这里是只有 通过 isArrayLikeObject
校验的值才回返回,通过 baseUniq
进行去重,传入自定义函数 iteratee
这里的判断有一点问题,只判断了 isArrayLikeObject(iteratee)
,如果 传入的最后一个参数为字符串的话,也是不会通过这个校验的,但是字符串传递给 baseUniq
使用的话,会报类型错误,需要的是一个 function
类型,所以这里保险起见,应该加
isArrayLikeObject(iteratee) || typeof iteratee !== 'function'
# Example
console.log(unionBy([1.1,2.1,3.1],[2.2,3.2,4.2],(v) => v|0)) // [ 1.1, 2.1, 3.1, 4.2 ]