You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:59