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

相关推荐
狂炫冰美式2 分钟前
你还在古法PPT吗,试试HTML呢?免费编辑导出工具给 xdm 放这了
前端·后端·github
万少40 分钟前
未来组织的分水岭不是员工数量,而是人才密度
前端·后端·面试
任磊abc41 分钟前
nextjs16配置eslint+prettier
前端·eslint·nextjs·prettier
x***r1511 小时前
Another-Redis-Desktop-Manager.1.3.7安装步骤详解(附Redis可视化连接与Key管理教程)
前端·bootstrap·html
Captaincc1 小时前
你真的知道自己把 AI 用在了哪里吗?这是 Vibe Usage 想回答的问题
前端·vibecoding
道友可好1 小时前
OpenSpec:轻到起飞的 AI 编程规范层
前端·人工智能·后端
kyriewen2 小时前
我招了一个“Prompt工程师”来写前端,结果项目差点崩了
前端·javascript·面试
jingling5552 小时前
Flutter | 商城项目完整实战
前端·flutter·前端框架
IT_陈寒2 小时前
React状态管理这个坑,我爬了整整三天才出来
前端·人工智能·后端
小新1102 小时前
从零开始 Vue.js
前端·javascript·vue.js