JavaScript实现两数之和与Map数据结构详解
本文详细解析了使用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程序设计有所帮助。
Object.assign合并JS对象的用法与注意事项
2026-11-05 17:56:08
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
