一天一个仿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是一个接收两个参数。囧
分类:
一天一个函数实现
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了