如何检测JavaScript Map初始化数据中的重复键并抛出错误?
如何检测JavaScript Map初始化数据中的重复键并抛出错误?
兄弟,你碰到的这个问题确实有点坑——因为JavaScript的Map在初始化的时候,遇到重复的键会直接把之前的键值对覆盖掉,等Map创建好之后,你根本看不到曾经有过重复键的痕迹。所以要解决这个问题,不能等Map创建完再检查,得在初始化之前先对传入的键值对数组做校验。
给你一个实用的解决方案:先写一个校验函数,提前检查键值对数组里的重复键,再用校验通过的数组去创建Map。
第一步:写一个键重复校验函数
这个函数会遍历传入的键值对数组,用Set来记录已经出现过的键(Set的键判断逻辑和Map完全一致,刚好适配),一旦发现重复键就直接抛出错误:
function validateMapEntries(entries) { const seenKeys = new Set(); for (const [key] of entries) { if (seenKeys.has(key)) { throw new Error(`检测到重复键:${key}`); } seenKeys.add(key); } return entries; // 校验通过后返回原数组,方便链式调用 }
第二步:用校验函数包装Map初始化数组
把你原本要传入Map的数组先丢给校验函数,再创建Map:
const colorEntries = [ [1, 'blue'], [2, 'orange'], [1, 'pink'], // 这个重复键会被立刻检测到 [3, 'yellow'], ]; // 先校验,再创建Map const colors = new Map(validateMapEntries(colorEntries));
运行这段代码的时候,就会直接抛出错误:Error: 检测到重复键:1,完美阻止了重复键被覆盖的情况。
补充说明
这里用Set来做重复检测是最优选择,因为它的时间复杂度是O(n),而且和Map一样采用SameValueZero算法判断键是否相等:比如NaN和NaN会被视为同一个键,+0和-0也会被视为同一个键,完全符合Map的键规则。如果你的业务场景需要特殊的键判断逻辑(比如区分+0和-0),可以在遍历的时候自定义判断条件,但绝大多数情况下用Set就足够了。
备注:内容来源于stack exchange,提问作者base
相关产品推荐
相关产品推荐

