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