打字稿地图迭代失败

2024-05-04

我正在使用下面的函数来比较两个地图。有趣的是 for 循环内的代码永远不会被执行。所以,console.log(key,val)代码永远不会被执行。当然,我确保我正在比较的映射不为空并且大小相同,以强制执行 for 循环内的代码。我犯了一个非常愚蠢的错误还是错过了一个深刻的概念?

private compareMaps(map1, map2) {
        var testVal;
        if (!(map1 && map2)) {
            return false;
        }
        if (map1.size !== map2.size) {
            return false;
        }
        for (var [key, val] of map1) {
            testVal = map2.get(key);
            console.log(key, val);
            if (testVal !== val || (testVal === undefined && !map2.has(key))) {
                return false;
            }
        }
        return true;
    }

有趣的是 for 循环内的代码永远不会被执行。我犯了一个非常愚蠢的错误还是错过了一个深刻的概念?

你忽略了这样一个事实:...

for...of不起作用Map在 ES6 之前的 TypeScript 中

当 TypeScript 编译器以 ES6 之前的 ECMAScript 为目标时,它会转译for...of语句变成for loop.

这段代码:

for (var [key, val] of map) {
    console.log(key);
}

就变成了这样的代码:

for (var _i = 0, map_1 = map; _i < map_1.length; _i++) {
    var _a = map_1[_i], key = _a[0], val = _a[1];
    console.log(key);
}

该怎么办?

Option 1:当我们必须以 ES6 之前的 ECMAScript 为目标时,forEach函数可以是一个合适的替代for...of环形。但要小心forEach有细微的差别for...of(例如提前退出、异步/等待)。

map.forEach((val, key) => { 
    console.log(key + ":" + val);
});

Option 2:当我们必须以 ES6 之前的 ECMAScript 为目标时,并且我们必须具有以下确切行为for...of, the 约翰·韦兹的回答 https://stackoverflow.com/a/45525426/1108891有道理:转换Map to an Array并迭代Array with for...of.

Option 3: 什么时候我们可以瞄准ECMAScript ES6 或更高版本 https://www.typescriptlang.org/docs/handbook/compiler-options.html, 使用for...of直接循环Map.

旁白:地图平等

如果要求是Map相等,考虑the every功能 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every。这满足了需要break在迭代中,因为every当找到第一个时立即返回false.

如果顺序很重要为了进行比较,使用every像这样:

function areEqual<K,V>(map1: Map<K,V>, map2: Map<K,V>) { 
    if(!map1 || !map2) return false;
    const array1 = Array.from(map1.entries());
    const array2 = Array.from(map2.entries());
    return array1.every(([k1, v1], index) => {
        const [k2, v2] = array2[index];
        return k1 === k2 && v1 === v2;
    });
}

如果顺序不重要,那么我们想要设置相等;使用every像这样:

function areSetEqual<K, V>(map1: Map<K, V>, map2: Map<K, V>) { 
    if(!map1 || !map2) return false;
    const array1 = Array.from(map1.entries());
    const array2 = Array.from(map2.entries());
    return array1.length === array2.length &&
        array1.every(([k1, v1]) => map2.get(k1) === v1);
}

以下是正在运行的功能的演示:

const map1 = new Map([["key1", "val1"], ["key2", "val2"]]);
const map2 = new Map([["key1", "val1"], ["key2", "val2"]]);
const map3 = new Map([["key2", "val2"], ["key1", "val1"]]);

console.log(areEqual(map1, map2)); // true
console.log(areEqual(map1, map3)); // false
console.log(areSetEqual(map1, map2)); // true
console.log(areSetEqual(map1, map3)); // true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打字稿地图迭代失败 的相关文章

随机推荐

  • 初始化 FingerpringManager.Crypto 对象,获取 AndroidKeyStore 提供程序不支持的加密原语?

    我使用的是安卓FingerPrintManagerAPI 并使用 KeyPairGenerator 创建密钥对 我想用公钥加密密码 然后在用户通过输入指纹进行身份验证时解密 但是一旦我运行我的项目 它就会崩溃并给出 引起原因 java la
  • 在最后(或第四次)出现“.”时分割字符串分隔符

    我喜欢按如下方式分隔字符串 给定以下字符串 Column 1 10 80 111 199 1345 127 0 0 1 3279 我想在最后一个 之后分隔数字 这将得到以下输出 Column 1 Column 2 10 1 12 5 134
  • Opencart 2.2.0 启用按制造商搜索

    我正在使用 OC 2 2 0 并一直在努力解决以下问题 示例 我在标题搜索中输入西门子 然后单击 显示所有结果 我的搜索页面将显示所有结果 问题是 结果列表仅包含名称中包含西门子的产品 我需要的是展示all 搜索结果列表中属于该制造商的产品
  • AJAX Webmethod 调用在 MVC3 上返回 404

    我一直在使用 EXTJS 4 并通过 AJAX 调用 aspx 页面代码隐藏上的 Webmethod 来加载我的商店 此方法适用于我的所有项目 直到我尝试将 EXTJS 4 工作移植到 MVC3 项目中 我的电话现在返回 404 关键部分是
  • stdClass 类的对象无法转换为字符串

    我现在在使用 PHP 时遇到问题 收到此错误 Object of class stdClass could not be converted to string当我在我的网站中运行这部分代码时发生错误 function myaccount
  • 列表:Count 与 Count() [重复]

    这个问题在这里已经有答案了 给定一个列表 首选哪种方法来确定内部元素的数量 var myList new List
  • 从控制器传递 gsp 参数

    我如何通过不是域类实例的控制器将参数传递到groovy服务器页面 您将参数放入返回给 GSP 的模型对象映射中 例如 def index def hobbies basketball photography render view inde
  • 如何在 Django 查询中动态提供查找字段名称? [复制]

    这个问题在这里已经有答案了 我想在 Django 模型的几个字段中查找某个字符串 理想情况下 它会类似于 keyword keyword fields foo bar baz results for field in fields look
  • jQuery 函数在不应该运行的时候运行

    我有一个函数 仅当宽度小于特定值时才需要运行 我已经这样做了if window width lt n 但当宽度大于 n 时 该函数也会运行 The if if window width lt n 由于背景颜色发生变化 浅灰色 1000px
  • VBA - 从 Internet Explorer 的框架通知栏中选择另存为

    我正在尝试通过以下方式下载另存为的文件框架通知栏的互联网浏览器 然而 经过大量搜索后 我只找到了点击解决方案save在框架通知栏上 到目前为止 我一直在尝试另存为示例站点上的文件 http www tvsubtitles net subti
  • Angular 5 webpack 3 aot

    我正在尝试使用 webpack 3 和 Angular 5 进行 aot 构建 但是网上有很多教程 没有一个没有问题地显示完整的示例 到目前为止我已经有了以下配置 对于那些对路径有疑问的人 我在 java 应用程序中使用它 webpack
  • Azure DataCache Windows Azure 模拟器出现问题,但未生成错误。应用程序只是挂起

    我有一个现有的 mvc4 Web 项目 我想将其部署到云服务并开始使用 azure 数据缓存 我已将 Windows azure 缓存 nuget 包添加到解决方案中的两个项目中 即 Web 项目和类库项目 这两个项目都需要这些项目 然后
  • CGContextSaveGState 无效上下文

    我正在开发一个 iOS 应用程序 它使用实时摄像头扫描条形码和二维码 然而有时我会遇到错误 这些错误不会使应用程序崩溃 但修复它们可能是个好主意 这些是错误
  • Firebase 的云功能:序列化 Promise

    在 onWrite 处理程序中 我想执行多次读取 操作一些数据 然后存储它 我对 Promise 概念还很陌生 关于 Firebase 在完成之前不会终止我的查询 我对以下 Promise 处理是否安全 exports test funct
  • 如何通过 JavaScript 设置输入值?

    我有 id txt1 的输入字段 但我无法从 JavaScript 更改该值
  • 根据 VS 活动配置定义 Wix 属性和值

    如何定义根据激活的 Visual Studio 配置而变化的 Wix 属性和值 例如对于我们的发布版本 var x 1 对于导出版本 var x 2 我们使用 wixproj 文件将属性传递到 WiX
  • 在 Fragment 和 Activity 之外通过 Hilt 进行现场注入

    我想知道是否可以在片段或活动之外使用字段注入 我知道我可以使用构造函数注入 但是我想知道是否也可以使用字段注入 我认为 Dagger 是可能的 当我尝试用注入的东西做某事时yclass字段我收到此错误 lateinit property y
  • 保存的数据带有不需要的引号

    我使用以下代码将数据框导出到 csv data write format com databricks spark csv options delimiter t codec org apache hadoop io compress Gz
  • 使用 BufferedImages 获取图像每个像素的颜色

    我试图获取图像的每个像素的每种颜色 我的想法如下 int pixels BufferedImage image image ImageIO read this getClass getResources image png int pixe
  • 打字稿地图迭代失败

    我正在使用下面的函数来比较两个地图 有趣的是 for 循环内的代码永远不会被执行 所以 console log key val 代码永远不会被执行 当然 我确保我正在比较的映射不为空并且大小相同 以强制执行 for 循环内的代码 我犯了一个