【源码共读】将值转换为数组《arrify》

news2025/1/15 6:52:15

使用

根据库的作者提供的readme,使用方式很简单:

1.安装

npm install arrify 

2.使用

import arrify from 'arrify';

arrify('🦄');
//=> ['🦄']

arrify(['🦄']);
//=> ['🦄']

arrify(new Set(['🦄']));
//=> ['🦄']

arrify(null);
//=> []

arrify(undefined);
//=> [] 

通过作者的提供的使用方式可知:

1.传入一个string,返回一个包含这个string的数组
2.传入一个array,返回这个array
3.传入一个Set,返回一个包含这个Set的数组
4.传入null或者undefined,返回一个空数组

思考:上面只提供了四种情况,那么其他的情况呢?

源码

通过GitHub提供的Codespaces来预览和调试代码,省去N多步骤。

代码结构很单纯,没有多余的东西,最主要的就是index.js文件,我们来看看:

export default function arrify(value) {
	if (value === null || value === undefined) {
		return [];
	}

	if (Array.isArray(value)) {
		return value;
	}

	if (typeof value === 'string') {
		return [value];
	}

	if (typeof value[Symbol.iterator] === 'function') {
		return [...value];
	}

	return [value];
} 

代码不长,加上空行也就19行,我们来看看:

1.首先判断传入的值是否为null或者undefined,如果是,返回一个空数组
2.然后判断传入的值是否为array,如果是,返回由这个值组成的数组
3.然后判断传入的值是否拥有Symbol.iterator的函数,如果有,通过解构赋值返回一个数组
4.最后返回一个包含这个值的数组,也就是其他情况

流程图如下:

graph TD
Start[开始] --> A[判断传入的值是否为null或者undefined]
A --> |是| a[返回一个空数组]
A --> B[判断传入的值是否为string]
B --> |是| b[返回一个包含这个值的数组]
B --> C[判断传入的值是否拥有Symbol.iterator的函数]
C --> |是| c[通过解构赋值返回一个数组]
C --> D[返回一个包含这个值的数组]
D --> End[结束] 

这里有一个优化空间,就是string类型的值可以不用判断,他最后也是返回一个包含这个值的数组,可以直接返回;

同理他使用...运算符来解构,那么Array的类型也可以不用判断,因为Array的类型也带有Symbol.iterator的函数,也可以使用...运算符来解构。

优化代码如下:

export default function arrify(value) {if (value === null || value === undefined) {return [];}if (typeof value[Symbol.iterator] === 'function') {return [...value];}return [value];
} 

运行结果相同,大家可以自行尝试,我就不截图了。

index.d.ts

作者还提供了TypeScript的类型定义文件,我们来看看:

export default function arrify<ValueType>(
	value: ValueType
): ValueType extends (null | undefined)
	? [] // eslint-disable-line@typescript-eslint/ban-types
	: ValueType extends string
		? [string]
		: ValueType extends readonly unknown[]
			? ValueType
			: ValueType extends Iterable<infer T>
				? T[]
				: [ValueType]; 

看着有点绕,但是其实很简单,这个类型文件的js版本就是上面作者写的库的代码,我们现在来拆解一下:

type hasNullOrUndefined<T> = T extends (null | undefined) ? [] : hasString<T>;

type hasString<T> = T extends string ? [string] : hasArray<T>;

type hasArray<T> = T extends readonly unknown[] ? T : hasIterable<T>;

type hasIterable<T> = T extends Iterable<infer U> ? U[] : [T];

type arrify<T> = hasNullOrUndefined<T>; 

拆解下来就是上面这样,我们来看看这个类型文件的作用:

1.首先判断传入的值是否为null或者undefined,如果是,返回一个空数组
2.然后判断传入的值是否为array,如果是,返回由这个值组成的数组
3.然后判断传入的值是否拥有Symbol.iterator的函数,如果有,通过解构赋值返回一个数组
4.最后返回一个包含这个值的数组,也就是其他情况

拆解下来是不是就是和上面库的代码流程相同?那么流程图也就不用画了,上面的流程图就是这个类型文件的流程图。

回到最开始提到的问题,其他类型的情况,在源码解读的过程中已经有了答案,就是返回包含这个值的数组。

好了,这次的分析就到这里了!

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获取第三方数据四种方式

目录 调用api 远程表 数据源 jsoup 如何判断该使用哪一种获取数据方式&#xff1f; 调用api 优点&#xff1a; 接口文档规范&#xff0c;体现在请求方式和传递的参数及参数类型有严格说明减少开发人员逻辑处理。api将功能的逻辑在接口内部封装好&#xff0c;不需要开发人…

禅道api调用(爬虫方式)

目录 获取所有进行中的项目信息 url postman Java代码 实体类 逻辑处理 根据项目id获取指定项目下所有未关闭的任务id url postman Java代码 总结 获取所有进行中的项目信息 url http://禅道地址xxx/zentao/project-all-doing-项目ID-order_desc-0.html postman Jav…

Linux-系统随你玩之--用户及用户组管理

一、用户基本介绍 Linux 系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统 管理员申请一个账号&#xff0c;然后才可以以这个用户登陆系统。 二、Linux中用户和组 2.1、用户和组介绍 用户&#xff1a; 每一个用户都…

独立开发变现周刊(第85期):一个会员服务的SaaS,月收入2万美金

分享独立开发、产品变现相关内容&#xff0c;每周五发布。目录1、Obsidian Canvas&#xff1a;一个无限的空间来构建你的想法2、message-pusher: 搭建专属于你的消息推送服务3、Careerflow LinkedIn: 40倍提升你的工作机会4、vue-pure-admin: 一款开源后台管理系统5、一个提供会…

CAD简单制作风向(风速)玫瑰图

背景: 风向玫瑰图(简称风玫瑰图)也叫风向频率玫瑰图,它是根据某一地区多年平均统计的各个风向的百分数值,并按一定比例绘制,一般多用8个或16个罗盘方位表示,由于形状酷似玫瑰花朵而得名。 玫瑰图上所表示风的吹向,是指从外部吹向地区中心的方向,各方向上按统计数值画…

雷军主导小米管理层变革:创业派隐退 职业经理人上位

雷递网 雷建平 12月23日岁末之际&#xff0c;在京东零售大幅调整后&#xff0c;小米也进行了一轮大调整。小米集团内部邮件所示&#xff0c;小米总裁王翔将在月底卸任集团总裁职务退休&#xff0c;同时&#xff0c;继续作为高级顾问为公司服务。小米集团总裁一职将由2019年加入…

基于K-means聚类算法进行客户人群分析

摘要&#xff1a;在本案例中&#xff0c;我们使用人工智能技术的聚类算法去分析超市购物中心客户的一些基本数据&#xff0c;把客户分成不同的群体&#xff0c;供营销团队参考并相应地制定营销策略。本文分享自华为云社区《基于K-means聚类算法进行客户人群分析》&#xff0c;作…

做跨境电商,如何从同类产品中脱颖而出?

随便打开一个跨境电商平台&#xff0c;你会发现自己售卖的产品有那么多类似的选择&#xff0c;如何确保你的产品能被客户选择&#xff1f;怎样在一系列产品中脱颖而出&#xff1f; 不少卖家提到了&#xff0c;搞差异化竞争&#xff0c;这是跨境电商卖家常挂在嘴边的一个词&…

绝对肝货,超全的 MyBatis 动态代理原理讲解。

1.MyBatis简介 MyBatis是一个ORM工具&#xff0c;封装了JDBC的操作&#xff0c;简化业务编程&#xff1b; Mybatis在web工程中&#xff0c;与Spring集成&#xff0c;提供业务读写数据库的能力。 2.使用步骤 1.引入依赖 采用Maven包依赖管理&#xff0c;mybatis-3.5.5版本&…

MyBatis学习 | 动态SQL

文章目录一、简介二、if标签2.1 if标签的简单使用2.2 where标签2.3 trim标签&#xff08;了解&#xff09;三、choose标签 & set标签3.1 choose标签3.2 set标签四、foreach标签4.1 foreach标签的简单使用4.2 批量插入五、内置参数六、bind标签七、sql标签 & include标签…

2163. 删除元素后和的最小差值 堆解法解析

2163. 删除元素后和的最小差值 给你一个下标从 0 开始的整数数组 nums &#xff0c;它包含 3 * n 个元素。 你可以从 nums 中删除 恰好 n 个元素&#xff0c;剩下的 2 * n 个元素将会被分成两个相同大小的部分。 前面 n 个元素属于第一部分&#xff0c;它们的和记为 sumfirs…

Fabric.js 保存自定义属性

本文简介 点赞 关注 收藏 学会了 之前有些工友留言&#xff1a;在 fabric.js 中怎么保存元素的自定义属性&#xff1f; 比如&#xff0c;创建一个矩形&#xff0c;这个矩形有自己的 ID 属性&#xff0c;在执行序列化操作出来的结果却看不到 ID 属性了。 如何在序列化时输出…

项目实战之旅游网(三)后台用户管理(下)

目录 一.查询用户角色 二.修改用户角色 三.修改用户状态 一.查询用户角色 一个用户可以有多个角色&#xff0c;我们也可以给某个用户分配某些角色&#xff0c;所以我们还需要新建一个实体类&#xff08;这个实体类需要放到bean下&#xff0c;因为这个实体类和数据据库不是对…

【Effective_Objective-C_3接口与API设计】

文章目录前言15.用前缀避免命名空间冲突要点总结16.提供全能初始化方法全能初始化要点17.实现description方法description以字典形式输出descriptiondebugDescription要点18.尽量使用不可变对象要点19.使用清晰协调的命名方式方法命名类与协议命名要点20.为私有方法名加前缀21.…

人-机器人交互导论

【编者按&#xff1a;变主体性才是智能的真正厉害之处&#xff0c;能够设身处地地转换角色、角度、视角看待交互对象中的不确定性&#xff0c;并使用相应的同理同情共主观性机制机理进行处理&#xff0c;例如梅西过人中的真假变化。在个体/群体智能中的变主体性控制也是人机环境…

【圣诞节】飘雪圣诞树

一、前言 马上2023年的圣诞节&#x1f384;要到了&#xff0c;作为一个程序员&#xff0c;没什么可以送给大家的&#xff0c;就给大家画一个圣诞树&#x1f384;&#xff0c;作为礼物来送给大家吧。 二、创意名 明月当空飘雪圣诞树 三、效果展示 四、实现步骤 主要是利用three.…

详细设计说明书(GB8567——88)基于协同的在线表格forture-sheet

详细设计说明书 1引言 1.1编写目的 该文档在概要设计的基础上&#xff0c;进一步的细化系统结构&#xff0c;展示了软件结构的图标&#xff0c;物理设计、数据结构设计、及算法设计、详细的介绍了系统各个模块是如何实现的&#xff0c;包括涉及到的算法&#xff0c;逻辑流程…

【LeetCode每日一题:1754. 构造字典序最大的合并字符串~~~双指针+贪心算法】

题目描述 给你两个字符串 word1 和 word2 。你需要按下述方式构造一个新字符串 merge &#xff1a;如果 word1 或 word2 非空&#xff0c;选择 下面选项之一 继续操作&#xff1a; 如果 word1 非空&#xff0c;将 word1 中的第一个字符附加到 merge 的末尾&#xff0c;并将其…

《Unified Structure Generation for Universal Information Extraction》论文阅读

文章目录文章介绍文章方案用于统一结构编码的结构化抽取语言&#xff08;SEL&#xff09;用于可控IE结构生成的结构模式指导使用UIE生成预训练任务微调任务总结参考文章地址&#xff1a; https://arxiv.org/abs/2203.12277文章介绍 目前对于自然语言处理中的信息抽取任务如关系…

业聚医疗港交所上市:市值76亿港元 为钱永勋家族企业

雷递网 雷建平 12月23日血管介入器械公司――业聚医疗集团有限公司&#xff08;OrbusNeich Medical Group Limited&#xff09;&#xff08;简称“业聚医疗”&#xff0c;股票代码为&#xff1a;6929 &#xff09;今日在港交所上市。业聚医疗发行价为8.8港元&#xff0c;募资净…