一天一个仿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是一个接收两个参数。囧

posted @ 2022-06-12 01:15  Dont  阅读(105)  评论(0编辑  收藏  举报