4
Fruit={4:"apple",2:"banana",3:"graps"}; 
var k;
for(k in Fruit)
{alert(k);}

アラートは 2 3 4 、IE8 & FF & 他のブラウズでこれを解決するのに役立つ場合、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

From the other answers it should be clear that javascript objects aren't ordered. You could use Object.keys in some browsers to do some kind of sorting. For example:

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
*/

If you want to keep a predefined order, you could use the same slightly altered function:

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
*/

Another idea may be to store the order as a property of the Object and use that:

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
*/

For browsers that don't support Object.keys Mozilla offers a shim here. IE9 supports it.

于 2012-04-24T11:41:09.190 に答える
0

これをコミュニティ ウィキにする理由は、1)質問者が質問に基準を追加したこと、および 2) この回答が本質的に Mark Reed の回答の修正版であることです。

別のアプローチ ( Mark Reed's answer の修正版) は、 sparse arrayを使用することです。スパース配列は、その長さ内のすべてのインデックスに要素を持たない配列です。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 に答える