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 让处理嵌套数组变得轻松,避免了手写循环和递归的麻烦。

相关推荐
threelab12 分钟前
Three.js UV 图像变换效果 | 三维可视化 / AI 提示词
javascript·人工智能·uv
之歆32 分钟前
DAY08_CSS浮动与行内块布局实战指南(下)
前端·css
yqcoder1 小时前
CSS Position 全解析:5 种定位模式详解
前端·css
Rhi6371 小时前
从零搭建项目:React 19 + Vite 8 + Tailwind CSS v4 实战配置
前端
竹林8181 小时前
用Viem替代ethers.js:从一次签名失败到完整迁移的实战记录
前端·javascript
之歆2 小时前
DAY08_CSS浮动与行内块布局实战指南(上)
前端·css
light blue bird2 小时前
主子端台二分法任务汇总组件
前端·数据库·.net·桌面端winform
不可能的是3 小时前
Claude Code 子 Agent 机制全解:怎么跑起来、怎么被管理、怎么互不干扰
javascript
jeffwang3 小时前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端
HSunR3 小时前
dify 搭建ai作业批改流
开发语言·前端·javascript