JavaScript实现两数之和与Map数据结构详解

作者:函数茶馆

时间:2026-10-23

浏览:522

本文详细解析了使用JavaScript求解两数之和的算法思路,核心在于利用Map数据结构存储已遍历元素及其索引,从而在O(n)时间复杂度内完成查找。同时深入介绍了Map对象的特性、与Object的区别、常用API及迭代方法,帮助开发者掌握高效的数据处理技巧。

文章目录

本文通过具体实例,详细讲解如何使用JavaScript解决两数之和的算法问题,旨在为读者提供清晰的参考与学习思路。

题目描述

给定一个整数数组以及一个目标数值,要求找出数组中相加等于该目标值的两个数字。

假设每个输入仅对应唯一的一组解,且同一个数组元素不能被重复使用。

::: tip 给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] :::

解法

利用 Map 来存储数组元素值与其对应下标的映射关系。对于当前遍历到的数 nums[i],判断差值 target - nums[i] 是否已存在于 Map 中。


var twoSum = function(nums, target) {
 const _length = nums.length;
 const _mayMap = new Map();
 for (let i = 0; i < _length; i++) {
 if (_mayMap.has(target - nums[i])) {
  return [_mayMap.get(target - nums[i]), i];
 }
 _mayMap.set(nums[i], i);
 }
};

Map回顾

Map 对象用于保存键值对,其中任何类型的值(包括对象或原始值)均可作为键或值。


new Map([iterable])

Iterable 可以是一个数组或其他 iterable 对象,其内部元素为键值对(由两个元素组成的数组,例如:[[ 1, 'one' ],[ 2, 'two' ]])。初始化时,每个键值对都会被添加到新的 Map 中。若传入的键为 null,它将被视为 undefined。

Objects 和 maps 的比较

Objects 与 Maps 在功能上相似,均支持按键存取值、删除键以及检测键是否绑定值。

因此,在以往的开发中(且无其他内置替代方案时),我们通常将对象当作 Maps 来使用。

然而,Maps 与 Objects 存在关键差异,在以下场景中,选择 Map 更为合适:

Object 的键只能是字符串或 Symbols,而 Map 的键可以是任意类型,包括函数、对象或基本类型。

Map 中的键值对保持插入顺序,而对象中的键则无序。因此,遍历 Map 时,会按照插入顺序返回键值。

可通过 size 属性直接获取 Map 的键值对数量,而 Object 的键值对数量需手动计算。

Map 支持直接迭代,而 Object 需先获取键数组再进行迭代。

Object 拥有原型链,原型上的键名可能与自定义设置的键名冲突。 尽管 ES5 起可使用 map = Object.create(null) 创建无原型的对象,但此用法并不常见。

在频繁增删键值对的场景下, 具有性能优势。

属性

Map.length length 属性值固定为 0。

get Map[@@species] 该构造函数用于创建派生对象。

Map.prototype 表示 Map 构造器的原型,允许添加属性以应用于所有 Map 实例。

所有 Map 对象实例均继承自 Map.prototype。

Map.prototype.constructor 返回创建实例原型的函数,默认为 Map 函数。

Map.prototype.size 返回 Map 对象中键/值对的数量。

Map.prototype.clear() 移除 Map 对象中的所有键/值对。

Map.prototype.delete(key) 若 Map 中存在该元素,则移除并返回 true;否则返回 false。

Map.prototype.entries() 返回一个新的 Iterator 对象,按插入顺序包含每个元素的 [key, value] 数组。

Map.prototype.forEach(callbackFn[, thisArg]) 按插入顺序,为 Map 中每个键值对调用一次 callbackFn。若提供 thisArg,则作为每次回调的 this 值。

Map.prototype.get(key) 返回键对应的值,若不存在则返回 undefined。

Map.prototype.has(key) 返回布尔值,表示 Map 实例是否包含指定键对应的值。

Map.prototype.keys() 返回一个新的 Iterator 对象,按插入顺序包含每个元素的键。

Map.prototype.set(key, value) 设置 Map 对象中键的值,并返回该 Map 对象。

Map.prototype.values() 返回一个新的 Iterator 对象,按插入顺序包含每个元素的值。

Map.prototype[@@iterator]() 返回一个新的 Iterator 对象,按插入顺序包含每个元素的 [key, value] 数组。

例子


var myMap = new Map();

var keyObj = {},
 keyFunc = function () {},
 keyString = "a string";

// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");

myMap.size; // 3

// 读取值
myMap.get(keyString); // "和键'a string'关联的值"
myMap.get(keyObj);  // "和键keyObj关联的值"
myMap.get(keyFunc);  // "和键keyFunc关联的值"

myMap.get("a string"); // "和键'a string'关联的值"
       // 因为keyString === 'a string'
myMap.get({});   // undefined, 因为keyObj !== {}
myMap.get(function() {}) // undefined, 因为keyFunc !== function () {}

传递数据


let valuesMap = new Map();

class payserviceclass {
 constructor() {}
 getItem(key) {
 const stringKey = String(key);
 if (valuesMap.has(key)) {
  return valuesMap.get(stringKey);
 }
 return null;
 }
 setItem(key, val) {
 return valuesMap.set(String(key), val);
 }

 clear() {
 return valuesMap.clear();
 }
}
const payservice = new payserviceclass();

export default payservice;

参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章