JS遍历Map按值匹配数组rgba对象查找对应键的故障排查
问题原因
核心错误为对象对比逻辑失效:JavaScript 中直接对普通字面量对象执行String()转换,返回结果固定为"[object Object]",不会序列化对象内部的属性值。你的forFilter函数对任意两个rgba对象执行对比都会返回true,最终过滤得到了Map的全部键。
修复代码
最简修复版(不改动原有代码结构)
仅修改对象对比逻辑,逐属性匹配rgba的四个字段即可:
function forFilter(mapvalue, arrvalue) { return mapvalue.r === arrvalue.r && mapvalue.g === arrvalue.g && mapvalue.b === arrvalue.b && mapvalue.a === arrvalue.a } function change_data(array) { let finlastring = []; for (let i = 0; i < array.length; i++) { let mapkey = [...mapped.entries()] .filter(({ 1: v }) => forFilter(v, array[i])) .map(([k]) => k); // 每个rgba值对应唯一键,直接取第一个元素即可,无需返回数组 finlastring.push(mapkey[0]) } return finlastring; }
性能优化版(适合高频查询场景)
提前构建rgba值→对应字符的索引,后续查询时间复杂度从O(n)降到O(1),不需要每次遍历整个Map:
// 索引只需构建一次,放在change_data函数外执行即可 const rgbaToChar = new Map() for (const [char, rgba] of mapped.entries()) { const idxKey = `${rgba.r},${rgba.g},${rgba.b},${rgba.a}` rgbaToChar.set(idxKey, char) } function change_data(array) { return array.map(rgbaItem => { const idxKey = `${rgbaItem.r},${rgbaItem.g},${rgbaItem.b},${rgbaItem.a}` return rgbaToChar.get(idxKey) }) }
内容的提问来源于stack exchange,提问作者findnate
相关产品推荐
相关产品推荐

