Lodash 源码阅读-setToArray
功能概述
setToArray
是 Lodash 库中的一个内部工具函数,专门用于将 JavaScript 的 Set 对象转换为数组形式。它将 Set 中的每一个唯一值提取出来,并按照遍历顺序组成一个新的数组返回。这个函数是 Lodash 中处理集合类型转换的重要组件,特别是在 _.toArray
方法中用于处理 Set 类型的输入。
前置学习
依赖函数
setToArray
是一个相对独立的函数,不直接依赖其他 Lodash 函数,但它与以下函数有关联:
- mapToArray:类似的函数,用于将 Map 对象转换为数组
- toArray :使用
setToArray
作为处理 Set 类型的转换函数
技术知识
- ES6 Set 对象:JavaScript 中的 Set 数据结构及其特性
- Set.prototype.forEach:Set 对象的遍历方法
- 数组预分配 :通过
Array(size)
预先分配数组空间的技术 - 闭包 :在
forEach
回调函数中使用外部变量的闭包特性
源码实现
javascript
/**
* Converts `set` to an array of its values.
*
* @private
* @param {Object} set The set to convert.
* @returns {Array} Returns the values.
*/
function setToArray(set) {
var index = -1,
result = Array(set.size);
set.forEach(function (value) {
result[++index] = value;
});
return result;
}
实现思路
setToArray
函数的实现思路非常直接明了:
- 初始化 :创建一个索引变量
index
(初始为 -1)和一个与 Set 大小相同的空数组result
- 遍历 Set :使用 Set 对象的
forEach
方法遍历每一个值 - 转换:将每一个值存储到结果数组中
- 返回结果:返回包含所有值的结果数组
这种实现方式简洁高效,充分利用了 ES6 Set 对象的内置方法,避免了手动实现迭代逻辑的复杂性。
源码解析
参数解析
javascript
function setToArray(set) {
函数接收一个参数:
set
:要转换的 Set 对象
初始化变量
javascript
var index = -1,
result = Array(set.size);
这里初始化了两个变量:
index
:当前处理的数组索引,初始为 -1(因为在使用前会先递增)result
:用于存储结果的数组,通过Array(set.size)
预先分配了与 Set 大小相同的空间
预先分配数组空间是一种优化技术,避免了数组在添加元素时可能发生的多次重新分配内存的开销。
遍历和转换
javascript
set.forEach(function (value) {
result[++index] = value;
});
这是函数的核心部分:
- 使用 Set 对象的
forEach
方法遍历 Set 中的每一个值 - 对于每一个值,递增索引
index
,并将值存储到结果数组的对应位置
与 Map 的 forEach
方法不同,Set 的 forEach
方法的回调函数只接收一个参数 value
,因为 Set 中只存储唯一值,没有键值对的概念。
返回结果
javascript
return result;
最后,函数返回包含所有值的结果数组。
总结
setToArray
是 Lodash 中一个简洁而实用的内部工具函数,专门用于将 ES6 Set 对象转换为数组。它的实现利用了 Set 对象的 forEach
方法,通过闭包和预分配数组空间实现了高效的转换。