如何在JavaScript中存储含重复键的键值对?Map方案无法满足需求
解决JavaScript中存储多组(x,y)键值对的问题
你当前的问题在于,使用Map时把单个xRepo作为键,当同一个x对应多个y时,后续的set操作会覆盖之前的y值——因为Map的键是唯一的,相同的键会被替换。要存储1750组唯一的(x,y)对,有几种更合适的方法:
方法1:使用组合字符串作为Map的键
把x和y拼接成唯一的字符串作为键,这样每个(x,y)组合都对应一个独一无二的键,不会出现覆盖问题:
function repository() { var snakeRepo = new Map(); var xRepo,yRepo,count=0; for (xRepo = 305;xRepo <=1085;xRepo=xRepo+15) { for (yRepo = 55;yRepo <=535;yRepo=yRepo+15) { // 拼接成"x,y"格式的唯一键 const key = `${xRepo},${yRepo}`; // 可以存储坐标对象或者任意你需要的值 snakeRepo.set(key, { x: xRepo, y: yRepo }); count++; } } console.log(snakeRepo); // 示例:获取x=305,y=55的条目 console.log(snakeRepo.get("305,55")); }
这种方式的优势是可以通过直接拼接字符串快速查找目标条目,非常直观。
方法2:使用嵌套Map(适合快速按x/y查询)
如果需要频繁通过x和y快速定位条目,可以用外层Map存x,内层Map存对应的y值:
function repository() { var snakeRepo = new Map(); var xRepo,yRepo,count=0; for (xRepo = 305;xRepo <=1085;xRepo=xRepo+15) { // 先检查当前x是否已存在,不存在则创建内层Map if (!snakeRepo.has(xRepo)) { snakeRepo.set(xRepo, new Map()); } const innerMap = snakeRepo.get(xRepo); for (yRepo = 55;yRepo <=535;yRepo=yRepo+15) { // 在内层Map中存储y相关的数据 innerMap.set(yRepo, true); count++; } } console.log(snakeRepo); // 示例:快速判断(x=305,y=55)是否存在 console.log(snakeRepo.get(305)?.get(55)); // 输出true }
这种结构的查找效率很高,适合需要频繁做存在性检查或者按x分组操作的场景。
方法3:用数组存储所有坐标对象(最简洁直观)
如果你的需求只是存储所有(x,y)组合,不需要特别高效的键查找,直接用数组存储每个坐标对象是最简单的方案:
function repository() { var snakeRepo = []; var xRepo,yRepo,count=0; for (xRepo = 305;xRepo <=1085;xRepo=xRepo+15) { for (yRepo = 55;yRepo <=535;yRepo=yRepo+15) { snakeRepo.push({ x: xRepo, y: yRepo }); count++; } } console.log(snakeRepo); // 示例:查找x=305,y=55的条目 const target = snakeRepo.find(item => item.x === 305 && item.y === 55); console.log(target); }
这种方式代码最简洁,遍历和修改都很方便,适合大多数普通场景。
方法4:使用数组作为Map的键(小众但可行)
Map允许引用类型作为键,所以可以直接用[x,y]数组作为键,但要注意:只有当两个数组是同一个引用时,才会被判定为相同的键,所以查找时需要遍历或者提前保存引用:
function repository() { var snakeRepo = new Map(); var xRepo,yRepo,count=0; for (xRepo = 305;xRepo <=1085;xRepo=xRepo+15) { for (yRepo = 55;yRepo <=535;yRepo=yRepo+15) { const key = [xRepo, yRepo]; snakeRepo.set(key, { x: xRepo, y: yRepo }); count++; } } console.log(snakeRepo); // 示例:遍历查找目标坐标 for (const [key, value] of snakeRepo) { if (key[0] === 305 && key[1] === 55) { console.log('找到目标:', value); break; } } }
这种方式适合需要把坐标对本身作为键的特殊场景,但日常使用中不如前三种方便。
内容的提问来源于stack exchange,提问作者JokerBean
相关产品推荐
相关产品推荐

