我可以假设 Object.keys 的响应顺序相同吗?

2023-12-10

{"/book":1,"/order":2,"deliver":3}

在我的应用程序的用户界面中,当我单击 /book 时,我从地图上知道要转到哪个步骤。 有时我只想通过增加数字来进入下一步,但确保 URL 也发生变化。

如何进行从步骤到键的反向映射。

我遇到了 ECMAScript 5 中引入的 Object.keys。 返回的键列表中元素的顺序是否始终相同?

["/book","/order","deliver"] 

如果是的话为什么会这样呢?字典是无序的,对吗?


The ECMAScript 5.1 规范指出

当使用参数 OF 调用 keys 函数时,将执行以下步骤:

  1. 如果 Type(O) 不是 Object,则抛出 TypeError 异常。
  2. 令 n 为 O 自身可枚举属性的数量
  3. 令 array 为创建新对象的结果,就像通过表达式 new Array(n) 一样,其中 Array 是标准内置函数 具有该名称的构造函数。
  4. 令索引为0。
  5. 对于 O 的每个自己的可枚举属性,其名称字符串为 P: (a) 使用参数 ToString(index) 调用数组的 [[DefineOwnProperty]] 内部方法,PropertyDescriptor {[[Value]]: P, [[可写]]:true,[[Enumerable]]:true,[[可配置]]:true},以及 错误的。 (b) 将索引增加 1。
  6. 返回数组。

如果一个实现定义了特定的枚举顺序 for-in 语句,步骤 5 中必须使用相同的枚举顺序 这个算法的。

Mozilla 开发网络对此有这样的说法for-in 循环:

for...in 循环以任意顺序迭代对象的属性(有关为什么不能依赖迭代的表面有序性的更多信息,请参阅删除运算符,至少在跨浏览器设置中)。

以及对删除操作符导致这个:

尽管 ECMAScript 使对象的迭代顺序依赖于实现,但似乎所有主要浏览器都支持基于最早添加的属性(至少对于不在原型上的属性)的迭代顺序。然而,就 Internet Explorer 而言,当对某个属性使用 delete 时,会产生一些令人困惑的行为,从而阻止其他浏览器将对象文字等简单对象用作有序关联数组。在资源管理器中,虽然属性值确实设置为未定义,但如果稍后添加回具有相同名称的属性,则该属性将在其旧位置进行迭代,而不是像人们在获得后所期望的那样在迭代序列的末尾进行迭代。删除该属性,然后将其添加回来。

因此,如果您想在跨浏览器环境中模拟有序关联数组,则必须使用两个单独的数组(一个用于键,另一个用于值),或者构建一个单属性对象的数组,等等。

我认为从中得出的结论是,在单个浏览器中,顺序是任意但一致的,但如果您比较多个浏览器,那么这些浏览器之间的顺序可能会有所不同(特别是在删除和重新添加属性时)。

Edit:

如果您想根据关联值对键进行排序,那么您可以执行以下操作:

var map = { b: 2, a: 1, c: 3 };

var keys = Object.keys( map );

console.log( keys ); // [ 'b', 'a', 'c' ]

var sorted_keys = keys.slice(0); // sliced so that we can see the difference in order

sorted_keys.sort( function( a, b ){ return map[a] - map[b]; } );

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

我可以假设 Object.keys 的响应顺序相同吗? 的相关文章

随机推荐

  • 如何深入LDAP树查找可以在Spring LDAP Security中进行身份验证的用户

    我想使用 Spring Security LDAP 身份验证 不过我想递归地遍历 ldap 树 不幸的是 我只能找到一个级别或深度的用户 例如 我的用户树如下所示 ouUsers 有用户 user1 user2 等 和子树 ouGenel
  • 带时区的 Java 日期验证器

    当日期中包含 EDT EST 时 我们是否有任何 API 来验证日期是否有效 我尝试过 Joda Java SimpleDateFormat 但我无法解析日期 以下是我收到的示例格式 2017 09 25 16 18 15 099 0400
  • 检查 json 响应是数组、整数还是字符串作为键?

    我收到 json 响应 其中 products 键有时具有 int 值 有时它具有数组 如何检查它是否有数组或Int products 25 or products 77 80 81 86 我正在用这个 self productsCount
  • Django/Python:在模板中显示 pdf

    我在 python 2 7 中使用 django 1 8 我想在模板中显示 pdf 才知道 感谢MKM 的回答我将其呈现在整页中 你知道如何渲染吗 这是我的代码 def userManual request with open C User
  • 使用正则表达式删除CSS注释

    如何使用 CSS 删除注释Regex Replace 注意 我无法使用 C 中提到的正则表达式 正则表达式删除CSS注释 这通常就足够了 假设cssLines是一个包含 CSS 文件所有行的字符串 Regex Replace cssLine
  • 将二维数组传递给常量参数的函数

    我从中学到了C 底漆 如果你想保护数组不被函数意外修改 你应该添加const函数定义头中指针声明之前的修饰符 遵循这个明智的建议 在下面的最小示例中 我尝试传递一个非常量二维数组array到函数Sum2D 其中一个参数是pointer to
  • 如何在 JTable 中创建翻转效果?

    在我的应用程序中 我想使用 JTable 的行创建翻转效果 例如 当鼠标进入该行时 该行的背景颜色会发生变化 反之 当鼠标退出该行时 该行的颜色将恢复正常 我怎样才能做到这一点 使用下面的代码 它将让您了解如何对 JTable 的行应用翻转
  • TabWidget 之间的分隔线

    TabWidget下的android divider属性是否有效 我尝试了 android 的选项卡布局教程只是为了测试 http developer android com resources tutorials views hello
  • JavaScript 中按字符串属性值对对象数组进行分组?

    我讨厌这个对象数组 每个对象都有一个日期 我希望能够将这些对象分组为月份 有没有办法转换这个 var data date 2016 08 13 date 2016 07 23 date 2016 08 11 date 2016 08 10
  • 指定的演员阵容无效#3

    我遇到这个问题 我收到 指定的转换无效 Visual Studio 内的错误列表中没有错误 这个错误可能来自我的 Access 数据库吗 private void Submit Click object sender EventArgs e
  • Ruby on Rails 4、Devise 和配置文件页面

    我是编码新手 所以这可能是一个简单的问题 我大约一个月前开始使用 RoR 不幸的是 我遇到了坎坷 似乎无法克服 我尝试过查看其他 SO 问题来寻求帮助 但我仍然是新手 所以编码建议对我来说仍然有点陌生 我希望有人能用更适合新手的术语来表述
  • Android:从重定向到另一个 url 的 url 连接 (graph.facebook.com) 获取位图

    我已经做了一切来获取一个 url 在那里我可以获取 Facebook 用户的个人资料图片 现在剩下的唯一问题是将该图像放入位图对象中 Since http graph facebook com现在首先将连接重定向 正如我们在网址中看到的 h
  • 了解/控制 MLT 融化幻灯片?

    考虑以下bash脚本 在 Ubuntu 18 04 melt 6 6 0 上 它使用melt制作幻灯片并在窗口中本地播放 SDL 使用者 大部分复制自https mltframework org blog making nice slide
  • 如何从 webpack 构建中删除 eval 和 Function 构造函数以避免 CSP 问题

    问题在于 Webpack 在编译代码中使用 eval 因此 Chrome 扩展程序和 Firefox 插件无法工作 因为它需要 CSP 属性中的 unsafe eval 指令 而这是不允许的 我使用 Vue js 作为前端webpack a
  • 将整数转换为字符串时出现问题

    我正在尝试将 EditText 字段中的两个数字相加 到目前为止 我有下面的代码 我相信它将 EditText 字段 pos1 deg 和 pos2 deg 转换为整数 deg1 和 deg2 deg1 Integer parseInt p
  • 如何在 axios 中设置 POST - multipart/form-data 的 MIME 类型?

    我需要使用 MIME 发送 POST 请求 multipart form data 这是我的 POST 标头的默认配置 axios defaults headers post Content Type multipart form data
  • 如何在从另一个表中提取数据的同时创建带有约束的表

    我正在尝试创建一个作家表 其中包含作者 ID 姓氏 名字 ISBN 以及每位作者所写书籍的书名 虽然使用与作者和书籍表相同的数据类型 但不复制这些表中的数据 并将作者 ID 作为主键 标题不为空 ISBN 作为引用 books 表中 ISB
  • Rmarkdown、Rstudio:pandoc.exe:从 TeX 源生成 PDF 时出错

    我正在尝试使用 RStudio 中的 knit pdf 按钮渲染 pdf 文档 但我不断收到此错误 pdfTeX error font expansion auto expansion is only possible with scala
  • 如何在 Django 的 ModelForm 中使用请求

    我想创建一个查询集 其中当前用户用作 ModelForm 中的过滤器 class BookSubmitForm ModelForm book forms ModelChoiceField queryset Book objects filt
  • 我可以假设 Object.keys 的响应顺序相同吗?

    book 1 order 2 deliver 3 在我的应用程序的用户界面中 当我单击 book 时 我从地图上知道要转到哪个步骤 有时我只想通过增加数字来进入下一步 但确保 URL 也发生变化 如何进行从步骤到键的反向映射 我遇到了 EC