大家好,我是前端西瓜哥。我最近尝试开启一个源码解读系列,不定期解读一些简单或复杂的源码。

今天要解读 npm 第三方库的源码:only,仓库地址为:https://github.com/tj/node-only

这个库是 tj 大神写的工具方法。tj 大神是一名程序员大佬,主要在 nodejs 领域做出了不少开源贡献,是 Express、Koa、node-canvas 等一系列知名开源项目的创建者和贡献者。

only 方法能干啥?

only 的功能很简单:返回一个对象的白名单属性。说具体点,就是提取指定对象的一些属性放到新对象里,并返回这个新对象。

const only = require('only');
​
var obj = {name: 'tobi',last: 'holowaychuk',email: 'tobi@learnboost.com',_id: '12345'
};
​
only(obj, 'name last email');
/* {name: 'tobi',last: 'holowaychuk',email: 'tobi@learnboost.com'}*/

only 方法要求传入一个对象,以及一个白名单列表,这个列表可以是属性名数组,也可以是通过空格间隔属性名表示的字符串。

第二个参数支持字符串格式,是因为使用更方便,能少写很多引号。使用上的优雅,是我们设计 API 时是需要做考量的。

only 库的实现

module.exports = function(obj, keys){obj = obj || {};if ('string' == typeof keys) keys = keys.split(/ +/);return keys.reduce(function(ret, key){if (null == obj[key]) return ret;ret[key] = obj[key];return ret;}, {});
};

代码解读

首先是对第一个参数 obj 做简单容错。如果 obj 是一个值为 undefined 或 null 之类的假值,我们就将其设置为一个空对象,防止抛出错误。

然后就是将可能是字符串形式的白名单转换为数组的格式。

使用的方法为:keys.split(/ +/),这里用到了 split 的正则表达式参数写法,/ +/ 这个正则表达式代表一个数量大于等于 1 的多个空格符。这其实是很常见的分割字符串拿到数组的写法。

最后用老鸟非常喜欢用的 Array.prototype.reduce() 的写法,来对 keys 数组进行迭代。

对于每个 key,只要原数组中不为 null 或 undefined,就将其浅拷贝到新对象中。

reduce() 方法的返回值就是我们要的新对象,直接将其返回。

我们再说说为什么一些资深前端喜欢用 reduce() 方法。其实是因为 reduce 这个方法相比 forEachmap 这些方法要更灵活,它能返回任何类型的值而写法不失简洁。 forEach 没有返回值,而 map 只能返回数组类型且大小相同的数组,虽然符合单一职责原则,但也因此失去了灵活性。

我曾经写过一篇关于 reduce 的文章,你感兴趣的话可以看看:为什么说数组实例的 reduce 方法灵活?

only 方法解读完毕。

「源码解读」知名程序员 TJ 的 only 库相关推荐

  1. 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣

    「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!

  2. 论「能写代码」的程序员与「会写代码」的程序员

    点击上方"程序人生",选择"置顶公众号" 第一时间关注程序猿(媛)身边的故事 之所以提这个话题,跟前两天在微信群里的讨论有关,年后本该是跳槽.找工作的高峰月份, ...

  3. bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋

    昨天bilibili又上热搜了,被某人在github上开了个账号,传了份整个后端代码到github,这是被人扒光了衣服看个精光啊. 这件事情,作为程序员的我们除了调侃和fork的同时,想一想,造成这个 ...

  4. 如何成为一位「不那么差」的程序员

    前言 已经记不清有多少读者问过: 博主,你是怎么学习的?像我这样的情况有啥好的建议嘛? 也不知道啥时候我居然成人生导师了.当然我不排斥这些问题,和大家交流都是学习的过程. 因此也许诺会准备一篇关于学习 ...

  5. 【附源码】为了帮助程序员谈恋爱,我做了这个APP

    前段时间,21岁的我第一次开启了名为『恋爱』的副本,开始打名叫『女朋友』的BOSS,深感过程艰难,整个过程仿佛0级的菜鸡进入了布满世界迷雾的地图,只能小心翼翼才能平安通过.然而在打怪升级的过程中,偶然 ...

  6. bilibili源码_bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋

    昨天bilibili又上热搜了,被某人在github上开了个账号,传了份整个后端代码到github,这是被人扒光了衣服看个精光啊. 这件事情,作为程序员的我们除了调侃和fork的同时,想一想,造成这个 ...

  7. 如何成为一位「不那么差」的程序员?

    作者:crossoverJie 来源:crossoverJie 前言 已经记不清有多少读者问过: 博主,你是怎么学习的?像我这样的情况有啥好的建议嘛? 也不知道啥时候我居然成人生导师了.当然我不排斥这 ...

  8. P8架构师:看源码是Java高级程序员的必经之路

    今天笔者在这里给大家介绍一下程序员的内功,内功修炼的内容就与之前文章中的技术内容大致相似,但是,那些技术不是说你想学就能学会的,如果你只是写了几年的业务代码,不对源码加以分析,那么你永远只是停留在码农 ...

  9. android仿秒拍源码,你所不知道的程序员 程序员其实真的很…【Bus Weekly】三十六期...

    原标题:你所不知道的程序员 程序员其实真的很-[Bus Weekly]三十六期 快,点击蓝色"字体"关注这个公众号,一起涨姿势- 现如今,程序员在中国的科技 圈可以说已经达到了举足 ...

最新文章

  1. python合并两个有序列表(list)
  2. Chrome之排序问题
  3. java 和 flash socket通信封装
  4. ScottGu之博客翻译-LINQ to SQL第三部分,查询数据库 (Part 3 - Querying our Database)
  5. python---微信聊天机器人
  6. 推荐5款好用的Linux音乐播放器
  7. 全球数据一致性,事务,微服务和Spring Boot / Tomcat / Jetty
  8. JavaScript——原型/原型链中的顶层对象(图解)
  9. Trees on the level UVA - 122 (二叉树的层次遍历)
  10. C++设计模式——从多态到观察者模式到MVC架构
  11. 梁肇新《编程高手箴言》书评
  12. 嵌入式 Web Server 温度检测系统
  13. Pandas读取excel数据——pearson相关性分析
  14. 我的世界漆黑一片 看不见明天
  15. 收藏多年的MySQL函数大全笔记,笔记一生一起走,那些日子不再有!
  16. 证明不同特征值的实对称矩阵的特征向量相互正交的
  17. 《王者荣耀游戏服务器架构演进(完整版)》读后感
  18. stm32f103HC05蓝牙串口程序和自制手机APP
  19. 未来音乐战场:从「听音乐」到「用音乐」
  20. JavaScript设计模式系统讲解与应用-笔记

热门文章

  1. django 使用网上下载的前端模板
  2. bk-02 C++ vector用法 博客园
  3. c语言结构体简单试题,C语言6结构体练习题6
  4. Air Jordan 32 Performance Review
  5. 评分卡分箱原则及单调性
  6. Linux刻录固态硬盘教程,linux迁移至固态硬盘全过程
  7. Linux---查看内存型号
  8. java定义一个长方形类,该类中具有长方形长宽两种属性,并具有相应的构造方法属性访问方法,计算长方形的周长和面积的方法,要求输出长是5,宽是4的长方形
  9. C语言反汇编 - 多维数组与指针
  10. 机器学习-泰坦尼克号幸存者预测