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

  • 相关阅读:
    ASP.NET(C#)图片加文字、图片水印
    CMake构建Visual Studio中MFC项目的Unicode问题
    用Visual Studio 2008(VS)编译WebKit的r63513
    此时学习中
    ASP.NET进阶——初学者的提高(长期)
    继续努力
    程序员阿士顿的故事
    iOS 深拷贝和浅拷贝
    Javascript中this的取值
    Lisp的本质(The Nature of Lisp)
  • 原文地址:https://www.cnblogs.com/dont27/p/16364633.html
Copyright © 2020-2023  润新知