Lodash源码阅读-flatten

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 的实现很简单:

  1. 先检查数组是不是空的或 null,如果是就返回空数组
  2. 如果数组有效,就调用 baseFlatten 函数,告诉它只扁平化一层(深度参数是 1)
  3. baseFlatten 会遍历数组的每个元素:
    • 如果元素是数组或类数组,就把它的元素拿出来放到结果里
    • 如果元素不是数组,就直接放到结果里
  4. 最后返回扁平化后的新数组

源码解析

空值检查

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 函数会:

  1. 遍历数组的每个元素
  2. 如果元素是数组且深度大于 0:
    • 如果深度大于 1,就递归处理这个元素
    • 如果深度等于 1,就把这个数组的元素都拿出来
  3. 如果元素不是数组,就直接放到结果里

总结

flatten 函数虽然简单,但有几个重要的特点:

  1. 只处理一层 - 只解开最外层的嵌套,里面的保持不变

  2. 不修改原数组 - 返回新数组,保持原数组不变

  3. 处理边界情况 - 能正确处理空数组、null 等特殊情况

这个函数在很多场景下都很有用,比如:

  • 处理嵌套的菜单结构
  • 合并多个数据源的结果
  • 简化 API 返回的嵌套数据
  • 处理 DOM 查询结果
  • 处理树形结构的第一层节点

通过简单的调用,flatten 让处理嵌套数组变得轻松,避免了手写循环和递归的麻烦。

相关推荐
一水鉴天1 分钟前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
杨杰3984 分钟前
我给嵌入式设备写了个 6MB 的 JavaScript 运行时(xuan)
javascript
栖凤12 分钟前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖13 分钟前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程
修炼的dance17 分钟前
页面塞了13.88 MB字体,导出的PDF只有71 KB
前端
qq_3691736318 分钟前
如何将 AI 生成的 HTML 网页发布成在线链接?不用自己搭建服务器
前端·人工智能·html·效率工具·html 发布
风花一世月25 分钟前
⚡ 我把一座含氢能源园区搬进了浏览器(五类能流实时算守恒,在线直接玩)
前端·人工智能
羲云1 小时前
Claude 越界事件之后:Agent 权限设计为什么不能只靠提示词
前端
行者全栈架构师1 小时前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构
全栈Agent 小李1 小时前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp