故障排除:比较两个地图的键(Javascript)

Troubleshooting: comparing keys of two maps (Javascript)

所以我正在尝试比较两个地图的键。下面的代码在语法上是有效的;然而,它 returns false 即使两个映射的键是相似的。这可能是什么问题?

const sc = new Map ();
sc.set ("item1",1)
sc.set ("item2",1)
sc.set ("item3",2)
sc.set ("item4",1) //ounce per serving //

const ing = new Map();
ing.set ("item1",1)
ing.set ("item2",1)
ing.set ("item3",2)
ing.set ("item4",1) //ounce per serving //

function compareMaps (map1,map2) {
if (ing.keys() == sc.keys() && (ing.size == sc.size)) {
    return "true"
} 
    return "false"

} 

compareMaps(ing, sc)

您的 ing.keys() == sc.keys() 比较有缺陷。

Map.prototype.keys() 方法 return 是一个 Iterator 到包含 Map 的所有键(按插入顺序排序)的对象。由于 ing.keys()sc.keys() 是 returning 单独的对象,即使它们可能具有相同的键,两个值的比较将 总是 return false.

keys() 方法正在返回单独的数组对象。尽管它们中的所有元素都相同,但它们是两个独立的对象,因此并不相等。

您需要的是深度相等,您可以自己编写或引入依赖项,例如 UnderscoreJS。他们有一个可爱的 isEqual() 功能,可以为您进行深度比较。

您可以查看 Map#size of both maps and take the key in an array and check against with Map#has

const sc = new Map();
sc.set("item1", 1)
sc.set("item2", 1)
sc.set("item3", 2)
sc.set("item4", 1) //ounce per serving //

const ing = new Map();
ing.set("item1", 1)
ing.set("item2", 1)
ing.set("item3", 2)
ing.set("item4", 1) //ounce per serving //

function compareMaps(map1, map2) {
    return map1.size === map2.size && [...ing.keys()].every(Map.prototype.has, map2);
}

console.log(compareMaps(ing, sc));