2011-01-18 15 views
1

違いがあります:javascriptオブジェクト/配列人口問題

var samples = { 
     "TB10152254-001": { 
      folderno: "TB10152254", 
      ordno: "001", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y" 
     }, 
     "TB10152254-002": { 
      folderno: "TB10152254", 
      ordno: "002", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y" 
     }, 

     "TB10152254-003": { 
      folderno: "TB10152254", 
      ordno: "003", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y" 
     } 
    }; 

var samples = new Array(); 
samples["TB10152254-001"] = { 
      folderno: "TB10152254", 
      ordno: "001", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y"}; 

samples["TB10152254-002"] = { 
      folderno: "TB10152254", 
      ordno: "002", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y" 
     }; 

samples["TB10152254-003"] = { 
      folderno: "TB10152254", 
      ordno: "003", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y" 
     }; 

EDIT: 私はどのように移入します:

私は再フレーズ問題でしょうが動的にハッシュする? 私はTB10152254-003が動的なので、私はsamples.TB10152254-003のようなことはできません...そうでも可能ですか?

答えて

2

Arrayはオブジェクトの型であるため、どちらも機能します。しかし、この方法で配列を使用する利点はありません。また、for/inを使用してプロパティを反復処理すると簡単に問題を起こすことがあります。

オブジェクトは、名前付きプロパティに使用する適切な型です。インデックスプロパティにのみArrayの使用を予約します。


編集に関しては、角括弧の表記法を使用して、配列と同じ方法でオブジェクトを動的に取り込むことができます。

// Create a new empty object. You an use "new Object()" if you wish 
var samples = {}; 

    // Populate the "samples" object in the same way you would an Array. 
samples["TB10152254-001"] = { 
      folderno: "TB10152254", 
      ordno: "001", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y"}; 

samples["TB10152254-002"] = { 
      folderno: "TB10152254", 
      ordno: "002", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y" 
     }; 

samples["TB10152254-003"] = { 
      folderno: "TB10152254", 
      ordno: "003", 
      startfootage: "", 
      endfootage: "", 
      tagout: "Y" 
     }; 
+0

実際には両方とも機能しません。これをAjax関数(Jquery ajax)に渡し、最初のものだけが好きです。私は彼らが同等であるという印象を受けていました....(はい、私はそれを渡す前にそれをjasonifyします)。 – sarsnake

+0

@gnomixa:彼らは両方とも、名前付きプロパティに対して値を正常に格納するという意味で機能します。私がオブジェクト(最初のもの)を使うと言ったのは、副作用の可能性があります。 – user113716

+0

ok、どうやって動的にハッシュを設定するのですか?誰もこれに答えないようです。つまり、静的に定義することは必ずしも可能ではありません。私は迷っています。 – sarsnake

1

はい。 2番目の例の例では、ArrayObjectとして「乱用」しています。これをしないでください。

数値索引付けされた値のみにはArrayが、ある種のハッシュ表には平文Objectsが使用されます。

私はArraysObjectsについて詳しく読むことをお勧めします。

JavaScriptでは、基本的にすべてがオブジェクトです。配列。しかし、Arrayオブジェクトは、数値インデックスデータを処理する追加の方法を提供します。

2番目の例でsamples.lengthを実行したときに、おそらく最も差異が見られます。普通のオブジェクトにはプロパティーがありませんlength、配列はそうです。配列の場合は、配列に格納されている要素の数がわかります。 2番目の例でsamples.lengthを呼び出すと、配列に実際に要素がないため、0が返されます。

"ドット表記"、object.property、および "配列表記"、object['property']の2つの可能性があることは、混乱を招く可能性があります。しかし、これは配列ではないオブジェクトの機能です。

キーを生成するか、プロパティ名を変数に格納すると、配列表記法が便利になります。

更新:書かれたよう

、あなたは、例えば、動的プロパティを作成するために、配列表記を利用することができます:あなたはプロパティにアクセスしたい場合は

var samples = {}; 

for(var i = 0; i < 4; i++) { 
    samples["TB10152254-" + i] = { 
     folderno: "TB10152254", 
     ordno: i, 
     startfootage: "", 
     endfootage: "", 
     tagout: "Y" 
    } 
} 

、あなたはキーを反復するfor...inループを使用する必要があります。

for(var key in samples) { 
    var value = samples[key]; 
} 

しかしノート:​​これまでの配列をループにfor...inを使用しないでください。私がリンクしているページには、理由も書かれています。

+0

私の編集した質問を見る – sarsnake

+0

@gnomixa:私の更新も見てください。 –