2012-01-03 8 views
0

は、誰かが、おそらくこれを見てもらえと "読解")?JavaScriptの連想配列とjQuery.each()

4つの個別のconsole.log()呼び出しは、最初のものを除いて、私が期待するものを正確に出力します。なぜそれは長さが0であると言っているのですか?

$ .each()イテレータのものは何も出力しません。何故なの?

+0

あなたのコードを質問の本文に投稿してください。 – tkone

答えて

2

4つの個別のconsole.log()呼び出しは、最初のものを除き、私が期待するものを正確に出力します。なぜそれは長さが0であると言っているのですか?

lengthの数値プロパティのみが考慮されます。 'ko'は数値ではありません。 specificationから

:このArrayオブジェクトの

lengthプロパティは、値が常に名前配列インデックスあるすべての削除可能性の名前よりも数値的に大きいデータプロパティです。

Where array index is defined as:

プロパティ名(文字列値の形で)Pは場合は、配列インデックスであり、ToStringメソッド(ToUint32(P))は、Pに等しい場合にのみおよびToUint32(P)は、2 -1に等しくない。

したがって、koは配列インデックスではありません。

$ .each()イテレータのものは何も出力しません。何故なの?

jQueryのは、おそらくこのように、配列としてその値を反復処理し、引数を認識しているので:

for(var i = 0; i < arg.length; i++) 

あなたは既にtranslations.length0であることに気づきました。


あなたは連想配列として配列を使用する間違いを犯しています。代わりにオブジェクト使用します。

var translations = {}; 
translations['ko'] = {}; 

を使用すると、配列に数値以外のプロパティを割り当てることができる理由は、単に配列があまりにもオブジェクトであるという事実です。しかし、そういうものとして使うべきではありません。特別な配列メソッドは非数値プロパティには適用されません。

MDN JavaScript Guideの配列について詳しくお読みになることをお勧めします。

0

実際には、連想配列はオブジェクトです。そして、オブジェクトは実際に長さを持っていません。別のノート、jQueryのだろうループで

オブジェクト/連想配列a =キー、B =オブジェクトの場合

for(a in b) 

に似たものとを通して、あなたはその後、

で値を取得しますが
b[a] 

何が起こっているのかをもう少し説明すること:

var b = []; //this is an array "object" 
b[0] = 1; //this would set the 0 index of b to 1 
b['test'] = 'value';//this would set the property 'test' of the array object to 'value' 

また、Javascriptを可能にあなたは2つの方法でプロパティにアクセスします。 []:

b['test'] = b.test; 
1

オブジェクトが必要です。 JavaScriptで配列をので、あなたは、名前を経由して数字だけ

をそのメンバーにアクセスするので、どちらかができない連想ではありません。

var translations = {}; 
translations.length = 0; 
translations['ko'] = {}; 
translations.length++; 
translations['ko']['Read more'] = '자세히보기'; 
translations['ko']['Read less']  = '덜 읽기'; 

console.log(translations.length); 
console.log('ko' in translations); 
console.log('wtf' in translations); 
console.log(translations['ko']['Read less']); 

$.each(translations, function(lang, phrases) { 
    console.log(lang); 
}); 

しかし、JS内のオブジェクトの長さを持っていないので、属性、あなたは1を追加する必要があると思います

0

var translations = [];を配列として宣言します。次の文translations['ko'] = [];は、実際にはkoのプロパティをの翻訳に追加します。したがって、translations.koを使用してアクセスできます。 1つの要素を配列に追加するには、push文を使用する必要があります。配列の長さを増やすには、要素をもう1つ追加してを翻訳に変換します。ここのデモをご覧ください:http://jsfiddle.net/diode/VkFRU/5/