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

相关推荐
进击的尘埃5 分钟前
Navigation API 如何重塑前端路由
javascript
散步去海边8 分钟前
Pretext 初识——零 DOM 测量的文本布局引擎
前端
早點睡39010 分钟前
ReactNative项目OpenHarmony三方库集成实战:react-native-orientation-locker
javascript·react native·react.js
xw-busy-code10 分钟前
npm 包管理笔记整理
前端·笔记·npm
早點睡39021 分钟前
ReactNative项目OpenHarmony三方库集成实战:react-native-localize
javascript·react native·react.js
踩着两条虫22 分钟前
AI驱动的Vue3应用开发平台 深入探究(十六):扩展与定制之自定义组件与设计器面板
前端·vue.js·人工智能·开源·ai编程
棋鬼王28 分钟前
Cesium(十) 动态修改白模颜色、白模渐变色、白模光圈特效、白模动态扫描光效、白模着色器
前端·javascript·vue.js·智慧城市·数字孪生·cesium
酉鬼女又兒31 分钟前
零基础快速入门前端蓝桥杯Web备考:BOM与定时器核心知识点详解(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯
ThridTianFuStreet小貂蝉32 分钟前
面试题1:请系统讲讲 Vue2 与 Vue3 的核心差异(响应式、API 设计、性能与编译器)。
前端·javascript·vue.js
俊劫36 分钟前
AI Harness - 2026 AI 工程新范式
前端·openai·ai编程