Skip to content

Latest commit

 

History

History
41 lines (28 loc) · 1.76 KB

invertBy.md

File metadata and controls

41 lines (28 loc) · 1.76 KB

lodash源码分析之invertBy

本文为读 lodash 源码的第二百九十三篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash

gitbook也会同步仓库的更新,gitbook地址:pocket-lodash

源码分析

invertByinvert 的作用类似,不过可以传入一个迭代器 iterateeiteratee 接收每次迭代的 value ,然后会返回一个新值作为结果的 key ,并且 invertBy 不像 invert ,值只有一个属性,而是有一组属性。

源码如下:

const hasOwnProperty = Object.prototype.hasOwnProperty
function invertBy(object, iteratee) {
  const result = {}
  Object.keys(object).forEach((key) => {
    const value = iteratee(object[key])
    if (hasOwnProperty.call(result, value)) {
      result[value].push(key)
    } else {
      result[value] = [key]
    }
  })
  return result
}

同样是使用 Object.keys 来获取所有的可枚举属性,使用 forEach 遍历,在遍历的过程中,调用 iteratee 得到 value 作为结果的属性。

如果 result 中已经存在该属性,则表示在这次迭代之前已经设置过值,则使用 push 将这次的属性压入数组中即可。注意这里的 key 不会去重。

如果没有,则初始化一个只有 key 元素的数组。

License

署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)

最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:

作者:对角另一面