2012-03-18 53 views
3

以JavaScript对象有4个属性:JavaScript for循环,但反向?

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

var obj = new Object(); 

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

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

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

我该怎么做?

感谢, 杰克

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

+0

只需使用一个数组。 – delnan 2012-03-18 21:24:52

+3

对象没有任何顺序。你的问题的前提是无效的。 – Incognito 2012-03-18 21:25:30

+0

你实际上是在调用你自己的对象'Object'吗?这可能会导致问题,因为系统中的每个新对象都会尝试从中继承。 – dwerner 2012-03-18 21:25:47

回答

12

A for (x in y)不以任何特定顺序处理属性,因此您无法依赖任何所需顺序。

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

使用ES5(或ES5垫片),你可以得到所有的属性与数组:

var keys = Object.keys(obj); 

然后,您既可以在标准词汇顺序或排序使用自定义功能进行排序:

keys.sort(fn); 

而且,那么你可以访问他们所需的顺序:

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

也不保证顺序的一致性...... – jondavidjohn 2012-03-18 21:26:07

+0

而且你应该使用Object.keys'方法,或者至少检查该属性是不是用'obj.hasOwnProperty(prop)'继承的' – Saebekassebil 2012-03-18 21:27:29

+0

对象I我指的是从JSON.parse返回的那个。这些属性似乎始终是有序的。没有keys()方法。 – Jack 2012-03-19 19:16:06

1

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

2

数组是有序的对象。对象中的属性本身是无序的。但是,如果你有,你想从后无论for..in结构将产生前工作的一些具体的原因,你可以这样做:

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

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