当前位置:首页 > JavaScript

js map 实现

2026-04-06 13:35:58JavaScript

map 方法的基本原理

map 是 JavaScript 数组的高阶函数,用于对数组每个元素执行回调函数并返回新数组。其核心特点是不修改原数组,而是通过映射关系生成新数组。

原生 map 用法示例

const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // 输出: [2, 4, 6]

手动实现 map 的步骤

定义函数框架

创建一个接受回调函数和可选 thisArg 的函数:

js map 实现

function customMap(callback, thisArg) {
  const result = [];
  // 后续逻辑填充
  return result;
}

遍历原数组

使用 for 循环遍历数组的每个元素:

for (let i = 0; i < this.length; i++) {
  // 处理每个元素
}

执行回调并收集结果

对每个元素调用回调函数,并将结果存入新数组:

js map 实现

const mappedValue = callback.call(thisArg, this[i], i, this);
result.push(mappedValue);

完整实现代码

Array.prototype.customMap = function(callback, thisArg) {
  if (typeof callback !== 'function') {
    throw new TypeError(callback + ' is not a function');
  }

  const result = [];
  for (let i = 0; i < this.length; i++) {
    const mappedValue = callback.call(thisArg, this[i], i, this);
    result.push(mappedValue);
  }
  return result;
};

// 使用示例
const arr = [1, 2, 3];
const squared = arr.customMap(x => x * x);
console.log(squared); // 输出: [1, 4, 9]

关键实现细节

  1. 类型检查:确保回调是函数类型
  2. 参数传递:正确处理 thisArg 绑定
  3. 索引传递:提供当前索引和原数组引用
  4. 稀疏数组:原生 map 会跳过空位,此处简化实现

边界情况处理

处理稀疏数组

如需完全模拟原生行为,需增加空位检测:

if (!(i in this)) {
  result.length++; // 保持稀疏性
  continue;
}

链式调用支持

返回的数组可继续调用其他数组方法:

[1, 2, 3]
  .customMap(x => x + 1)
  .filter(x => x > 2); // 输出: [3, 4]

性能优化建议

  1. 提前分配数组长度:
    const result = new Array(this.length);
  2. 避免不必要的类型检查(生产环境可移除)

标签: jsmap
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…