一天一个仿lodash函数实现-difference
difference
从第一个参数数组中找出后面参数数组里未出现的元素,组成新的数组返回
function difference(arr, ...rest) {
// 扁平化rest
const target = rest.reduce((pre, cur) => {
return pre.concat(cur)
}, [])
return arr.filter(item => !target.includes(item))
}
differenceBy和differenceWith的疑惑
被differenceBy和differenceWith给弄懵了,看起来差不多,但又不知道差在哪里?
看了下 底层实现
xBy的iteratee是针对每个元素的转换值再比较,而xWith的comparator是一个直接比较两个元素的比较函数。
differenceBy (加上shorthand支持)
function differenceBy(arr, ...args) {
if(args.length<2) {
throw new Error('iteratee missing or target array missing')
}
const rest = args.slice(0, args.length-1)
const keyOrFunc = args[args.length-1]
let iteratee;
if(typeof keyOrFunc === 'string') {
iteratee = (item) => item[keyOrFunc]
}else{
iteratee = keyOrFunc
}
// 扁平化rest
const target = rest.reduce((pre, cur) => {
return pre.concat(cur.map(i=>iteratee(i)))
}, []);
return arr.filter(item => !target.includes(iteratee(item)))
}
differenceWith
function differenceWith(arr, ...args) {
if(args.length<2) {
throw new Error('iteratee missing or target array missing')
}
const rest = args.slice(0, args.length-1)
const comparator = args[args.length-1]
// 扁平化rest
const target = rest.reduce((pre, cur) => {
return pre.concat(cur)
}, []);
return arr.filter(item => {
for(let i=0;i<target.length;i++) {
if(comparator(target[i], item)) {
return false;
}
}
return true
})
}
因为没用过这个difference系列,对by和with还困惑了一段时间,直到写完实现拿文档例子调试才发现comparator是一个接收两个参数。囧