{"/book":1,"/order":2,"deliver":3}
在我的应用程序的用户界面中,当我单击 /book 时,我从地图上知道要转到哪个步骤。
有时我只想通过增加数字来进入下一步,但确保 URL 也发生变化。
如何进行从步骤到键的反向映射。
我遇到了 ECMAScript 5 中引入的 Object.keys。
返回的键列表中元素的顺序是否始终相同?
["/book","/order","deliver"]
如果是的话为什么会这样呢?字典是无序的,对吗?
The ECMAScript 5.1 规范指出
当使用参数 OF 调用 keys 函数时,将执行以下步骤:
- 如果 Type(O) 不是 Object,则抛出 TypeError 异常。
- 令 n 为 O 自身可枚举属性的数量
- 令 array 为创建新对象的结果,就像通过表达式 new Array(n) 一样,其中 Array 是标准内置函数
具有该名称的构造函数。
- 令索引为0。
- 对于 O 的每个自己的可枚举属性,其名称字符串为 P:
(a) 使用参数 ToString(index) 调用数组的 [[DefineOwnProperty]] 内部方法,PropertyDescriptor {[[Value]]: P,
[[可写]]:true,[[Enumerable]]:true,[[可配置]]:true},以及
错误的。
(b) 将索引增加 1。
- 返回数组。
如果一个实现定义了特定的枚举顺序
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(使用前将#替换为@)