一天一个仿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,也就是第二个参数不再支持属性字符串参数。