Lodash源码阅读-take

Lodash 源码阅读-take

概述

take 函数用于从数组开头提取指定数量的元素并返回新数组。与 drop 函数相反,drop 丢弃前面元素保留剩余部分,而 take 保留前面元素丢弃剩余部分。

前置学习

依赖函数

  • baseSlice:底层数组切片函数,实现核心切片逻辑
  • toInteger :将输入值转换为整数,处理 n 参数

技术知识

  • 数组切片:创建数组子集的操作
  • 参数默认值:通过条件判断设置默认参数
  • 类型转换:处理不同类型输入
  • 边界处理:处理空数组、负数等边界情况

源码实现

javascript 复制代码
/**
 * Creates a slice of `array` with `n` elements taken from the beginning.
 *
 * @static
 * @memberOf _
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to query.
 * @param {number} [n=1] The number of elements to take.
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @returns {Array} Returns the slice of `array`.
 * @example
 *
 * _.take([1, 2, 3]);
 * // => [1]
 *
 * _.take([1, 2, 3], 2);
 * // => [1, 2]
 *
 * _.take([1, 2, 3], 5);
 * // => [1, 2, 3]
 *
 * _.take([1, 2, 3], 0);
 * // => []
 */
function take(array, n, guard) {
  if (!(array && array.length)) {
    return [];
  }
  n = guard || n === undefined ? 1 : toInteger(n);
  return baseSlice(array, 0, n < 0 ? 0 : n);
}

实现思路

take 函数实现非常简单明了:首先检查输入数组是否有效,若无效则返回空数组;然后处理切片数量参数,确定默认值或转换为整数;最后调用 baseSlice 从数组开头提取指定数量的元素并返回。

源码解析

参数校验

javascript 复制代码
if (!(array && array.length)) {
  return [];
}

这行代码检查数组是否有效:

  • 如果 arraynullundefined 或者是空数组,直接返回 []
  • 简洁的写法同时检查了数组存在性和长度

例如:

javascript 复制代码
_.take(null); // => []
_.take([]); // => []
_.take(undefined); // => []

参数处理

javascript 复制代码
n = guard || n === undefined ? 1 : toInteger(n);

这段代码处理切片数量:

  • 如果存在 guard 参数或 n 未定义,使用默认值 1
  • 否则,将 n 转换为整数

其中 guard 参数用于在将 take 作为迭代器传给高阶函数时避免误解额外参数。这确保了即使传入非数字类型,也能得到合理的整数值:

javascript 复制代码
_.take([1, 2, 3]); // 默认取1个元素: [1]
_.take([1, 2, 3], "2"); // 转换为数字2: [1, 2]
_.take([1, 2, 3], 2.9); // 转换为整数2: [1, 2]

切片操作

javascript 复制代码
return baseSlice(array, 0, n < 0 ? 0 : n);

核心切片逻辑:

  • 从索引 0 开始(数组开头)
  • 切到索引 n(不包含)
  • 如果 n 小于 0,使用 0 作为结束索引,返回空数组

例如:

javascript 复制代码
// n为正数:取前n个
_.take([1, 2, 3, 4], 2); // => [1, 2]

// n为0:返回空数组
_.take([1, 2, 3, 4], 0); // => []

// n为负数:也返回空数组
_.take([1, 2, 3, 4], -2); // => []

// n超过数组长度:返回整个数组
_.take([1, 2, 3], 5); // => [1, 2, 3]

总结

take 函数虽然实现简单,但它体现了几个重要的编程原则:

  1. 单一职责:专注于一个任务(提取数组开头元素)
  2. 不可变性:返回新数组而非修改原数组
  3. 健壮性:处理边界情况和各种输入类型
  4. 实用性:解决日常编程中的常见需求

这个简洁的函数在数据处理和 UI 展示中非常有用,可以用来创建预览、实现分页、限制结果数量等,是 Lodash 中实用且易于理解的工具函数之一。

相关推荐
学习-学习6 分钟前
前端打包后白屏不报错:从 source-map、MIME、路由 base 到 chunk 加载失败的全链路排查
前端
霸道流氓气质12 分钟前
摄像头视频预览实现教程:从原理到落地(ZLMediaKit+ flv.js+ Spring Boot)
javascript·spring boot·音视频
三84418 分钟前
笔记:在同一个物理服务器上通过nginx的虚拟主机生成多个不同的web站点
java·前端·nginx
double_eggm20 分钟前
uniapp.3
开发语言·前端·javascript
索西引擎34 分钟前
【React】状态提升模式:设计原理、权衡分析与架构决策框架
前端·react.js·架构
Thanks_ks2 小时前
从零手写一个 Promise:深入理解 JavaScript 异步编程的本质
javascript·promise·事件循环·异步编程·手写源码·前端进阶·promises/a+
胡萝卜术9 小时前
力扣5. 最长回文子串
前端·javascript·面试
我星期八休息9 小时前
网络编程—应用层HTTP协议
linux·运维·开发语言·前端·网络·网络协议·http
不好听61310 小时前
前端路由完全指南(下篇):懒加载、History 栈与工程化实践
前端·react.js
触底反弹11 小时前
🔥 从零搭建 RAG 知识库:爬虫→分词→向量化→检索,一步都不能错
javascript·人工智能·面试