2012-04-24 26 views
4
Fruit={4:"apple",2:"banana",3:"graps"}; 
var k; 
for(k in Fruit) 
{alert(k);} 

アラートはIE8 & FFで他の&はこのうち私を助け4 2 3を与える閲覧IE9のシーケンスで2 3 4になります。シーケンスが必要です4 2 3IE9連想配列

+0

チェックこの[フィドル](http://jsfiddle.net/pABaQ/) - Chromeはまた、 '2 3 4ありません' –

+3

は順番に実装されています。 http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop、ソートが必要になるhttp://stackoverflow.com/questions/5467129/sort-javascript-object-by -key –

答えて

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

(スタイルのポイントとして、あなたはまた、変数名を大文字にすべきではありません。あなただけはコンストラクタとして使用している機能のために大文字を使用します/"クラス")。ここでIE9の行動が間違っていないので

fiddle

+0

+1、私はこの汚いトリックが好きです – Starx

+0

とにかく 'fruit_keys'を別の配列に格納しようとするなら、' fruit'をオブジェクトではなく疎配列にするのはどうですか? – kojiro

+0

@kojiro:データから何を求めているかによって異なります。私はオブジェクトの選択が意図的であると仮定し、ある時点でidによってフルーツの名前を検索する必要がありますが、これは単なる前提です。 –

2

連想配列は、順序を持っていません。このように注文を格納できる既存のデータ型はありません。あなたの最善の策は、明示的に順序を保存するために、次のようになります。javascriptのオブジェクトが発注されていないことは明らかであろう他の回答から

var Fruit = [[4, "apple"], [2, "banana"], [3, "graps"]]; 
for (var i = 0; i < Fruit.length; i++) { 
    alert(Fruit[i][0]); 
} 
+0

これは無意味です。 – Starx

+0

これはループにとっては良い解決策ですが、実際にはオブジェクト内のidを実際に調べる必要がある場合は厄介です。 –

+0

このアプローチの有用性について疑問を呈しても、元の質問に関する文脈があまりないとは限りません。質問者がより有用な回答を望む場合、彼はもっと説明的な質問を自由にするべきです。 – kojiro

1

。一部のブラウザでは、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.keys Mozillaがshim hereを提供していますサポートしていないブラウザのために

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

。 IE9はそれをサポートしています。

+0

しかし、OPが望んでいるのは明示的に*並べ替えられた注文ではなく、挿入注文です。 –

+0

はい、答えを編集しました – KooiInc

+0

こんにちは。ありがとう2すべての解決策を見つけた2人。私は自分の必要に応じてより正確な答えが必要です。私の配列は、別のファイルと別のファイルのjavascriptコードから来ています。動的に設定された配列は、同じ名前の配列が複数あることを意味します。fruit = {4: "apple"、2: "banana"、3: "graps"}; fruit = {4: "apple"、3: "graps"}; fruit = {2: "apple"、3: "graps"};だから私は配列に私にjavascriptで動作する任意のソリューションを与える余分なパラメータを追加することはできません。 –

0

1)asker has added criteria to his questionと2)の理由から、この回答は本質的にマークリードの修正版です。

もう1つのアプローチ(Mark Reed's answerの修正版)はスパース配列を使用することです。スパース配列は、その長さ内のすべてのインデックスに要素を持たない配列です。我々はマークのコードを取るが、連想配列に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]); 
}