Javascript中的"for ... in"循环是否按照声明的顺序循环遍历hashtables/elements?是否有一个浏览器没有按顺序执行?
我想要使用的对象将被声明一次,永远不会被修改.
假设我有:
var myObject = { A: "Hello", B: "World" };
Run Code Online (Sandbox Code Playgroud)
我进一步使用它们:
for (var item in myObject) alert(item + " : " + myObject[item]);
Run Code Online (Sandbox Code Playgroud)
在大多数体面的浏览器中,我可以期待'A:'你好''总是先来'B:'世界"吗?
假设我有一个Javascript关联数组(又名哈希,又名字典):
var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;
Run Code Online (Sandbox Code Playgroud)
如何按排序顺序迭代键?如果它有助于简化事情,我甚至不需要这些值(它们都只是数字1).
我在JavaScript中有一组对象,如下所示:
Object collection = new Object();
collection[123] = new Item(); //another object
collection[425] = new Item();
collection[2134] = new Item();
//etc. etc.
//TODO: sort items
Run Code Online (Sandbox Code Playgroud)
我想根据集合中Item对象的属性对此集合进行排序.JS Array中有很好的内置排序功能,所以我的第一个想法是随后修改代码:
Object collection = new Array();
collection[123] = new Item(); //another object
collection[425] = new Item();
collection[2134] = new Item();
//etc. etc.
collection.sort(comparisonFunction); //where comparisonfunction handles the sorting logic
Run Code Online (Sandbox Code Playgroud)
现在集合很好地排序 - 但是,我无法使用属性访问项目,我曾经用它来设置它们,即
collection[2134]
Run Code Online (Sandbox Code Playgroud)
是null,因为JS数组不包含那么多元素(即使它会,它的结果也不会如预期的那样)
我需要的是
编辑:对象不需要像数组一样运行,也不是自然数组.我需要的是非常接近Java TreeMap - 一个集合,它维护一个特定的顺序,也是一个地图.或者以另一种方式解释,我需要一个普通的旧JavaScript对象(有些人称之为"关联数组"),其包含的用户创建的元素可以被排序.
编辑2:我最终使用的解决方案是Anatoliy,稍加修改.基本上我创建了一个数组,我在其中复制"集合"并映射两个对象(数组和集合)以获得两者的好处.还要感谢Roatin Marth指出迭代对象不能保证以任何顺序发生(我在修改Anatoliy的解决方案时考虑过这一点).
在Firefox中,输出按字母顺序排序(这是它们声明的顺序).在IE和Chrome中它们是数字的.所有最新版本.
哪个是对的?
<html>
<head></head>
<body>
<script type="text/javascript">
function makeArray()
{
var array = [{5:'Five',4:'Four',1:'One',3:'Three',2:'Two'}];
var msg = '';
for (var val in array[0])
{
msg = msg + val;
}
alert(msg);
}
</script>
<input type="button" onClick="makeArray();" value="Press Me" />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Back Story ...在SpiraTeam(我们当前的错误跟踪系统)中,许多列表(用户,模块等)使用与上述类似的格式进行排序.除非你使用FireFox,否则这会使查找内容变得非常困难和烦人.我的兴趣纯粹是学术性的,我只是问,因为我想知道哪个浏览器是正确的.