【问题标题】:JavaScript for in loop, but in reverse?JavaScript for in 循环,但反过来?
【发布时间】:2012-03-18 21:23:08
【问题描述】:

获取具有 4 个属性的 JavaScript 对象:

function Object() {
  this.prop1;
  this.prop2;
  this.prop3;
  this.prop4;
}

var obj = new Object();

我使用 for(in) 循环来检查每个属性,因为我不知道属性的编号或名称:

for(property in obj) {
  var prop = obj[property];
}

但是我想处理从最后一个开始的属性(在本例中为 prop4)。我想我想要一个反向循环。

我该怎么做?

谢谢, 杰克

添加:我所指的对象是从 JSON.parse 返回的对象。这些属性似乎是一致的。没有 keys() 方法。

【问题讨论】:

  • 对象没有任何顺序。你的问题的前提是无效的。
  • 您实际上是在将自己的对象称为“对象”吗?这可能会导致问题,因为系统中的每个新对象都会尝试从它继承。
  • 显然顺序对您很重要,使用具有属性的对象是这项工作的错误工具。
  • 我所指的对象是从 JSON.parse 返回的对象。这些属性似乎是一致的。

标签: javascript for-loop


【解决方案1】:

for (x in y) 不会按任何特定顺序处理属性,因此您不能指望任何所需的顺序。

如果您需要按特定顺序处理属性,则需要将所有属性放入一个数组中,对数组进行适当排序,然后按所需顺序使用这些键。

使用 ES5(或 ES5 shim),您可以将所有属性放入一个数组中:

var keys = Object.keys(obj);

然后,您可以按标准词汇顺序对它们进行排序,也可以使用您自己的自定义函数进行排序:

keys.sort(fn);

然后,您可以按照您想要的顺序访问它们:

for (var i = 0; i < keys.length; i++) {
    // process obj[keys[i]]
}

【讨论】:

  • 而且您可能应该使用Object.keys 方法,或者至少检查该属性是否没有使用obj.hasOwnProperty(prop)“继承”
  • 我所指的对象是从 JSON.parse 返回的对象。这些属性似乎是一致的。没有 keys() 方法。
  • 根据语言定义,可以按任何顺序返回属性。 .keys() 方法是 ECMAScript 5 规范的一部分,是 Object 原型上的一个方法(所以所有的 Objects 都会有它)。所有现代浏览器都实现了它,你可以阅读它here。它为您提供数组中对象的所有可枚举属性名称。如果您希望与没有实现它的旧浏览器兼容,那么很容易添加一个 shim,如果它不存在,它将添加 .keys() 方法。
  • 我使用的是 Chrome 17.0(现代浏览器),并且从 JSON.parse 返回的对象或存储在该对象中的任何对象都没有 keys() 方法。出现错误:Uncaught TypeError: Object #&lt;Object&gt; has no method 'keys' (anonymous function)
  • 好的。所以我决定使用 RTFM,我假设(!)myObject.keys()。我没有意识到它是 Object 上的静态方法。
【解决方案2】:

ECMAScript 标准没有定义 for in 循环的迭代顺序。如果要对数据类型进行排序,您将需要一个数组。

【讨论】:

    【解决方案3】:

    数组是有序的对象。对象中的属性本质上是无序的。但是,如果您有特定原因想要从后到前处理 for..in 构造将产生的任何内容,您可以这样做:

    var arr = [];
    for (prop in obj) {
       arr.push(prop);
    }
    
    for (var n=arr.length; n--; ){
       var prop = obj[arr[n]];
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 2016-03-30
      • 2012-11-18
      • 2015-02-25
      • 2011-10-21
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      相关资源
      最近更新 更多