javascript 相等-javascript-如何检查两个 Map 对象是否相等?

2023-08-25 0 5,370 百度已收录

如何检测两个对象具有相同的(键,值)对集?

我们可以假设所有的键和值都是原始数据类型。

解决这个问题的一种方法是使用map.entries(),从中创建一个链接列表,然后键盘对字段进行排序。 对另一张地图执行相同操作。 然后循环遍历两个字段来比较它们。 由于排序(性能低效)并使这些字段(内存效率低下),所有这些接缝都是麻烦且低效的。

有人有更好的主意吗?

最佳答案

没有“标准”或“内置”形式可以做到这一点。 从概念上讲javascript 相等,您只需比较具有相同键和每个键的值的两个 Map 对象,但没有额外的键。

为了使比较尽可能高效,您可以进行以下优化:

首先检查两个地图上的.size 属性。 如果两张地图的键数不同,那么您马上就会知道它们不可能相同。 据了解,保证它们具有相同数量的键允许您仅迭代其中一个映射并将其值与另一个映射进行比较。 使用 for(var[key,val]ofmap1) 迭代器语法来迭代键,这样您就不必自己构建或排序键的链接列表(应该更快,内存效率更高)。 最后javascript 相等,如果您确保在发现不匹配时立即返回比较,那么当它们不相同时,将会减少执行时间。

稍后,由于 undefined 是 Map 中的合法值,但如果未找到键,它也是 .get() 返回的值,因此我们必须小心,因此如果我们比较的值是未定义的,则附加 .has() 是执行。

因为Map对象的键和值本身可以是对象,所以如果你想对对象进行深入的属性比较是否相等,而不仅仅是更简单的 === Javascript默认使用来测试同一个对象。 或者,如果您只对具有键和值基元的对象感兴趣,则可以防止这些复杂情况。

对于仅测试严格值相等的函数(检测对象以查看它们是否是相同的数学对象,而不是深度属性比较),您可以执行如下操作。 它使用 ES6 语法来有效地迭代地图对象,并尝试通过在不匹配时漏电并在检测到不匹配时立即返回 false 来提高性能。

"use strict";
function compareMaps(map1, map2) {
    var testVal;
    if (map1.size !== map2.size) {
        return false;
    }
    for (var [key, val] of map1) {
        testVal = map2.get(key);
        // in cases of an undefined value, make sure the key
        // actually exists on the object so there are no false positives
        if (testVal !== val || (testVal === undefined && !map2.has(key))) {
            return false;
        }
    }
    return true;
}
// construct two maps that are initially identical
var o = {"k" : 2}
var m1 = new Map();
m1.set("obj", o);
m1.set("str0", undefined);
m1.set("str1", 1);
m1.set("str2", 2);
m1.set("str3", 3);
var m2 = new Map();
m2.set("str0", undefined);
m2.set("obj", o);
m2.set("str1", 1);
m2.set("str2", 2);
m2.set("str3", 3);
log(compareMaps(m1, m2));
// add an undefined key to m1 and a corresponding other key to m2
// this will pass the .size test and even pass the equality test, but not pass the
// special test for undefined values
m1.set("str-undefined", undefined);
m2.set("str4", 4);
log(compareMaps(m1, m2));
// remove one key from m1 so m2 has an extra key
m1.delete("str-undefined");
log(compareMaps(m1, m2));
// add that same extra key to m1, but give it a different value
m1.set("str4", 5);
log(compareMaps(m1, m2));
function log(args) {
    var str = "";
    for (var i = 0; i < arguments.length; i++) {
        if (typeof arguments[i] === "object") {
            str += JSON.stringify(arguments[i]);
        } else {
            str += arguments[i];
        }
    }
    var div = document.createElement("div");
    div.innerHTML = str;
    var target = log.id ? document.getElementById(log.id) : document.body;
    target.appendChild(div);
}

如果你想进行深度对象比较,而不是仅仅比较它们在数学上是否是同一个对象,其中值可以是对象或链表,那么事情就会变得更加复杂。

因此,您需要一种考虑以下所有触发因素的深度对象比较方法:

嵌套对象的递归比较以避免循环引用(可能导致无限循环) 了解如何比较外部对象的各个类型,例如日期。

由于其他地方已经写了很多关于如何进行深度对象比较的文章(包括 StackOverflow 上许多高票答案),因此我认为这不是您问题的主要部分。

关于javascript-如何检查两个Map对象是否相等? ,我们在 StackOverflow 上发现了类似的问题:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript 相等-javascript-如何检查两个 Map 对象是否相等? https://www.wkzy.net/game/151030.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务