Lodash 源码阅读-flatten
概述
flatten
函数的作用很简单:把嵌套数组"压扁"一层。比如 [1, [2, [3]], 4]
变成 [1, 2, [3], 4]
,只把最外层的嵌套解开,里面的嵌套保持不变。这个函数在处理多层嵌套数据时特别有用,可以让数据结构更简单,更容易处理。
前置学习
依赖函数
- baseFlatten:实际干活的函数,处理数组扁平化的核心逻辑
技术知识
- 数组操作:数组的基本操作和嵌套数组的概念
- 递归:函数自己调用自己的基本概念
源码实现
javascript
/**
* Flattens `array` a single level deep.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Array
* @param {Array} array The array to flatten.
* @returns {Array} Returns the new flattened array.
* @example
*
* _.flatten([1, [2, [3, [4]], 5]]);
* // => [1, 2, [3, [4]], 5]
*/
function flatten(array) {
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, 1) : [];
}
实现思路
flatten
的实现很简单:
- 先检查数组是不是空的或
null
,如果是就返回空数组 - 如果数组有效,就调用
baseFlatten
函数,告诉它只扁平化一层(深度参数是 1) baseFlatten
会遍历数组的每个元素:- 如果元素是数组或类数组,就把它的元素拿出来放到结果里
- 如果元素不是数组,就直接放到结果里
- 最后返回扁平化后的新数组
源码解析
空值检查
javascript
var length = array == null ? 0 : array.length;
return length ? baseFlatten(array, 1) : [];
这行代码做了两件事:
- 检查数组是不是
null
或undefined
,如果是就把长度设为 0 - 如果长度是 0(空数组或
null
),直接返回空数组 - 否则调用
baseFlatten
开始处理
baseFlatten 的调用
javascript
baseFlatten(array, 1);
这里传了两个参数:
- 第一个是要处理的数组
- 第二个是深度参数
1
,表示只扁平化一层
baseFlatten
函数会:
- 遍历数组的每个元素
- 如果元素是数组且深度大于 0:
- 如果深度大于 1,就递归处理这个元素
- 如果深度等于 1,就把这个数组的元素都拿出来
- 如果元素不是数组,就直接放到结果里
总结
flatten
函数虽然简单,但有几个重要的特点:
-
只处理一层 - 只解开最外层的嵌套,里面的保持不变
-
不修改原数组 - 返回新数组,保持原数组不变
-
处理边界情况 - 能正确处理空数组、
null
等特殊情况
这个函数在很多场景下都很有用,比如:
- 处理嵌套的菜单结构
- 合并多个数据源的结果
- 简化 API 返回的嵌套数据
- 处理 DOM 查询结果
- 处理树形结构的第一层节点
通过简单的调用,flatten
让处理嵌套数组变得轻松,避免了手写循环和递归的麻烦。