对象字段序列

时间:2013-12-17 13:15:15

标签: javascript

我有一个用javascript代码编写的JavaScript对象,如下所示:

var rtnStr = {"000":"area000","020":"area020","030":"area030",
              "040":"area040","047":"area047","049":"area049",
              "050":"area050","060":"area060","070":"area070",
              "100":"area100", "900":"area900"};

for (var key in rtnStr) {
  document.write('rtnStr[' + key + ']= ' + rtnStr[key] + '<br />');
}

然后我在浏览器中运行代码,得到了结果:

rtnStr[100]= area100
rtnStr[900]= area900
rtnStr[000]= area000
rtnStr[020]= area020
rtnStr[030]= area030
rtnStr[040]= area040
rtnStr[047]= area047
rtnStr[049]= area049
rtnStr[050]= area050
rtnStr[060]= area060
rtnStr[070]= area070

对象字段(键)序列与我声明的不一样,如何得到如下结果?

rtnStr[000]= area000
rtnStr[020]= area020
rtnStr[030]= area030
rtnStr[040]= area040
rtnStr[047]= area047
rtnStr[049]= area049
rtnStr[050]= area050
rtnStr[060]= area060
rtnStr[070]= area070
rtnStr[100]= area100
rtnStr[900]= area900

3 个答案:

答案 0 :(得分:1)

JavaScript对象是无序的。

如果要按排序顺序输出其属性,请执行以下操作:

  1. 创建数组
  2. 遍历对象,将属性名称推送到数组
  3. 对数组进行排序
  4. 遍历数组(并使用值访问原始对象)。

答案 1 :(得分:0)

 var rtnStr = {"000":"area000","020":"area020","030":"area030",
              "040":"area040","047":"area047","049":"area049",
              "050":"area050","060":"area060","070":"area070",
              "100":"area100", "900":"area900"};

  array_ = [];

  for (var key in rtnStr) {
    array_.push(key)
  }

  array_.sort();


  for (var key in array_) {
    document.write('rtnStr[' + key + ']= ' + rtnStr[key] + '<br />');
  }

答案 2 :(得分:0)

正如@Quentin所提到的,JavaScript对象中属性的顺序是未定义的。该规范甚至没有提及是否会按不同的for..in以相同的顺序返回属性。

您可以做的是获取数组中的键并对其进行排序:

var rtnStr = {"000":"area000","020":"area020","030":"area030",
              "040":"area040","047":"area047","049":"area049",
              "050":"area050","060":"area060","070":"area070",
              "100":"area100", "900":"area900"};

var keys = Object.keys(rtnStr).sort().forEach(function(key){
  document.write('rtnStr[' + key + ']= ' + rtnStr[key] + '<br />');
});

MDN有一个Object.keys的页面,您可以在其中找到它所使用的浏览器,并为那些它没有填充的填充物填充。

需要注意的一点是,您的初始版本代码也会在继承的属性上进行迭代。这通常被认为是不安全的,Object.keys没有表现出这种行为。