4
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

4

4 回答 4

6

在 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]);
}

(作为一种风格,您也不应该将变量名大写;仅对用作构造函数/“类”的函数使用大写字母)。

小提琴

于 2012-04-24T11:27:40.220 回答
2

关联数组没有顺序,所以这里 IE9 的行为并没有错。没有现有的数据类型可以以这种方式存储订单。您最好的选择是明确存储订单:

var Fruit = [[4, "apple"], [2, "banana"], [3, "graps"]];
for (var i = 0; i < Fruit.length; i++) {
    alert(Fruit[i][0]);
}
于 2012-04-24T11:28:15.353 回答
1

从其他答案中,应该清楚 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.keysMozilla 的浏览器,这里提供了一个 shim。IE9 支持它。

于 2012-04-24T11:41:09.190 回答
0

将其设为社区 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]);
}
于 2012-04-24T14:20:41.643 回答