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) : [];

这行代码做了两件事:

  • 检查数组是不是 nullundefined,如果是就把长度设为 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 让处理嵌套数组变得轻松,避免了手写循环和递归的麻烦。

相关推荐
审小匠OpenCPAi32 分钟前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
Revolution6136 分钟前
一个公共表格组件,是怎么一步步失控的
前端·前端工程化
mONESY39 分钟前
React useState 核心原理与最佳实践:从异步更新到性能优化全解
javascript
腻害兔1 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
whyfail1 小时前
前端学 Spring Boot(2):一次点击,如何穿过整个后端?
前端·spring boot·后端
AI多Agent协作实战派2 小时前
AI多Agent协作系统实战(二十三):Agent读HEARTBEAT.md不读AGENTS.md——openclaw的文件加载之谜
前端·数据库·人工智能·uni-app
gis开发之家2 小时前
《Vue3 从入门到大神37篇》Vue3 源码详解(七):watch 与 watchEffect 源码对比——副作用是如何被追踪的?
javascript·前端框架·vue3·vue3源码
2601_955760073 小时前
如何用 Claude Opus 5 API 批量扩展长尾关键词和文章选题
前端·python·搜索引擎
KaMeidebaby3 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
bloglin999993 小时前
langchain 和 langgraph 和 react
javascript·react.js·langchain