Fruit={4:"apple",2:"banana",3:"graps"};
var k;
for(k in Fruit)
{alert(k);}
当在 IE8 和 FF 和其他浏览器中帮助我解决这个问题时,警报将 2 3 4
在 Ie9 中按顺序排列。4 2 3
我需要的序列是 4 2 3
Fruit={4:"apple",2:"banana",3:"graps"};
var k;
for(k in Fruit)
{alert(k);}
当在 IE8 和 FF 和其他浏览器中帮助我解决这个问题时,警报将 2 3 4
在 Ie9 中按顺序排列。4 2 3
我需要的序列是 4 2 3
在 JavaScript 中,您无法控制键从对象中出来的顺序。如果您关心顺序,请将键放在单独的数组中:
var fruit = { 4:"apple", 2:"banana", 3:"grapes" };
var fruitKeys = [ 4, 2, 3 ]
for (var i=0, l=fruitKeys.length; i<l; ++i) {
var k = fruitKeys[i];
alert(k + ":" + fruit[k]);
}
(作为一种风格,您也不应该将变量名大写;仅对用作构造函数/“类”的函数使用大写字母)。
关联数组没有顺序,所以这里 IE9 的行为并没有错。没有现有的数据类型可以以这种方式存储订单。您最好的选择是明确存储订单:
var Fruit = [[4, "apple"], [2, "banana"], [3, "graps"]];
for (var i = 0; i < Fruit.length; i++) {
alert(Fruit[i][0]);
}
从其他答案中,应该清楚 javascript 对象没有排序。您可以Object.keys
在某些浏览器中使用来进行某种排序。例如:
function objSortedList(obj){
var keys = Object.keys(obj).sort(), key;
while(key = keys.shift()){
console.log(key+': '+obj[key]);
}
}
//usage
var fruit = {4:"apple",2:"banana",3:"graps"};
objSortedList(fruit);
/* =>result:
2: banana
3: graps
4: apple
*/
如果你想保持一个预定义的顺序,你可以使用相同的稍微改变的函数:
function objSortedList(obj,keys){
keys = keys || Object.keys(obj).sort()
var key;
while(key = keys.shift()){
console.log(key+': '+obj[key]);
}
}
//usage
var fruit = {4:"apple",2:"banana",3:"graps"};
objSortedList(fruit,[4,2,3]);
/* =>result:
4: apple
2: banana
3: graps
*/
另一个想法可能是将订单存储为 Object 的属性并使用它:
function objSortedList(obj,keys){
keys = keys
|| (obj.order ? obj.order.slice() : false)
|| Object.keys(obj).sort()
var key;
while(key = keys.shift()){
if (/^order$/.test(key)){ continue; }
console.log(key+': '+obj[key]);
}
}
//usage
var fruit = {4:"apple",2:"banana",3:"graps",order:[4,3,2]};
objSortedList(fruit);
/* =>result:
4: apple
3: graps
2: banana
*/
对于不支持Object.keys
Mozilla 的浏览器,这里提供了一个 shim。IE9 支持它。
将其设为社区 wiki,因为 1)提问者为他的问题添加了标准,并且 2)此答案本质上是 Mark Reed 答案的修改版本。
另一种方法(Mark Reed 答案的修改版本)是使用稀疏数组。稀疏数组是在其长度内的每个索引处都没有元素的数组。如果我们采用 Mark 的代码,但转换fruit
为关联数组,它看起来像这样:
var fruit = new Array();
fruit[2] = "banana";
fruit[3] = "graps";
fruit[4] = "apple";
// The rest of the solution is the same as Mark's:
var fruitKeys = [ 4, 2, 3 ]
for (var i=0, l=fruitKeys.length; i<l; ++i) {
var k = fruitKeys[i];
alert(k + ":" + fruit[k]);
}