「源码解读」TJ 大神的 only 库

简介: 前端西瓜哥

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

今天要解读 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 方法解读完毕。

相关文章
|
12月前
|
人工智能 监控 自动驾驶
Apollo:Meta 联合斯坦福大学推出专注于视频理解的多模态模型,能够理解长达数小时的视频
Apollo是由Meta和斯坦福大学合作推出的大型多模态模型,专注于视频理解。该模型通过“Scaling Consistency”现象,在较小模型上的设计决策能够有效扩展至大型模型,显著提升了视频理解能力。
330 24
Apollo:Meta 联合斯坦福大学推出专注于视频理解的多模态模型,能够理解长达数小时的视频
|
10月前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
6196 8
|
缓存 物联网 数据库
如何帮助我们改造升级原有架构——基于TDengine 平台
一、简介 TDengine 核心是一款高性能、集群开源、云原生的时序数据库(Time Series Database,TSDB),专为物联网IoT平台、工业互联网、电力、IT 运维等场景设计并优化,具有极强的弹性伸缩能力。同时它还带有内建的缓存、流式计算、数据订阅等系统功能,能大幅减少系统设计的复杂度,降低研发和运营成本,是一个高性能、分布式的物联网IoT、工业大数据平台。 二、TDengine 功能与组件 TDengine 社区版是一开源版本,采用的是 AGPL 许可证,它具备高效处理时序数据所需要的所有功能,包括: SQL 写入、无模式写入和通过第三方工具写入 S标准 SQL 查
332 12
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第20天】Java零基础教学篇,手把手实践教学!
358 4
|
前端开发 JavaScript
|
安全 Linux 算法框架/工具
open Euler安全加固
open Euler安全加固
1023 11
|
存储 监控 数据库
InfluxDB数据备份与恢复策略
【4月更文挑战第30天】本文介绍了InfluxDB的时间序列数据备份与恢复策略。备份策略包括定期快照备份、增量备份(借助外部工具如rsync)及备份验证。恢复策略涉及从快照和备份验证环境恢复数据,强调了恢复过程中的注意事项,如关闭写入操作和数据一致性。实施这些策略能有效保障InfluxDB数据的安全性和可用性。
1076 0