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

posted @ 2022-06-10 20:26  Dont  阅读(305)  评论(0编辑  收藏  举报