一天一个仿lodash函数实现-keyBy、groupBy、find
最近常用的几个keyBy、groupBy和find
keyBy将数组以某个元素属性作为key整理成字典
groupBy类似keyBy但字典value是数组,类型分组
find从数组中找到匹配的元素,虽然用数组filter方法也可以,但是filter是过滤,如果匹配返回的永远是数组。find返回的是匹配元素。
// keyBy
function keyBy(arr, keyOrFunc){
const map = {}
if(typeof keyOrFunc==='string') {
arr.forEach(item=>{
const key = item[keyOrFunc]
map[key] = item
})
}else{
arr.forEach(item=>{
const key = keyOrFunc(item)
map[key] = item
})
}
return map
}
// groupBy
function groupBy(arr, keyOrFunc){
const map = {}
if(typeof keyOrFunc==='string') {
arr.forEach(item=>{
const key = item[keyOrFunc];
if(!map[key]){
map[key] = []
}
map[key].push(item)
})
}else{
arr.forEach(item=>{
const key = keyOrFunc(item)
if(!map[key]){
map[key] = []
}
map[key].push(item)
})
}
return map;
}
// find
function find(arr, predict, fromIndex = 0) {
// 默认当成function
let predictFunc = predict;
// find(arr, key) // if arr[key] is true
if(typeof predict === 'string') {
predictFunc = (item) => item[predict]
// find(arr, [key, value]) // if arr[key] === value
} else if(predict instanceof Array) {
predictFunc = (item) => item[predict[0]] === predict[1]
// find(arr, obj)
} else if(Object.prototype.toString.call(predict) === '[object Object]') {
const keys = Object.keys(predict)
predictFunc = item => {
return keys.every(key => item[key] === predict[key])
}
}
for(let i=fromIndex;i<arr.length;i++) {
const item = arr[i];
if(predictFunc(item)) {
return item;
}
}
return undefined;
}
在看lodash的github master时,似乎有意在v5版本移除shorthand,也就是第二个参数不再支持属性字符串参数。
分类:
一天一个函数实现
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2014-06-10 function变量困惑