打字稿地图迭代失败

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(使用前将#替换为@)

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

  • 使用selenium IDE提取部分文本并将其放入变量中

    有人可以告诉我应该使用哪个命令来使用 Selenium Ide 从文本中仅提取数字 694575 并将其放入变量中以供进一步使用 这是带有文本的 div div class loginBoxTitle Edit Exhibition Cen
  • 我可以从 HTTP 请求中找到无线接入点的 BSSID(MAC 地址)吗?

    假设有人在咖啡店里无线连接到互联网 并向 johnsveryownserver com 发送 HTTP 请求 服务器端 有什么方法可以确定我的MAC地址吗 无线接入点他们连接到什么 请注意 我对他们机器的 MAC 地址不感兴趣 如果我无法使
  • Typescript 函数返回类型取决于参数的数量或类型

    假设我有一个函数 它应该根据参数的数量和类型返回不同的类型 我该如何在 TypeScript 中描述这一点 function foo t number string function foo t number s string boolea
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • Flask wtf.quick_form 运行一些 javascript 并设置表单变量

    我正在创建博客文章 到目前为止已经使用普通的 html 表单完成了 我所做的一个有趣的想法是运行 javascript onclick 并使用页面中的额外数据在表单中设置一个隐藏变量 这很好地传递到服务器并通过 request form 获
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 jQuery 向表中添加新行,并为其分配递增的 id

    我有一个现有的 HTML 表格 它是用户输入 GPS 点的表单的一部分 用户还可以选择上传 GPS 数据点 我想要一个用户可以按下的按钮 其中一些 Javascript 会向表中添加一个或多个新行 但新行必须继续增加表中使用的名称和 id
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • ES6 模板文字的延迟执行

    我正在玩新的ES6 模板文字 http tc39wiki calculist org es6 template strings 我首先想到的是String format对于 JavaScript 所以我开始实现一个原型 String pro
  • 替换两个引号之间的字符串

    我想转动一根绳子str hello my name is michael what s your s into hello my name is span class name michael span 我怎样才能在 JavaScript
  • 在javascript中动态生成行?

    我是 javascript 新手 我想在按下 Tab 时动态生成行 并希望获取在动态生成的行中输入的值 以便我可以在 servlet 代码中使用这些值 这是我的html
  • 我可以使用 jQuery 动态创建文件(及其内容)吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这是我的 HTML 代码 ul li
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o

随机推荐

  • 初始化 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 循环内的代码 我犯了一个