Ads by Google

  • --.--.--(--) --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[JavaScript] 配列と連想配列の扱いは分けないとだめなようだ

  • 2009.04.23(木) 19:43
ご無沙汰なエントリー。
最近はjQueryで遊んでいます。

まだ軽くしか触っていませんが、
デザイン関連のプロパティは充実してますが
イベント関連のプロパティはいまいち使い勝手が悪いですね。

今回はjQuery.eachを触っててはまったので。
jQuery.eachは「jQuery.each(object, callback)」と扱います。
objectは配列、または連想配列を扱うことが可能なのですが、
定義した入れ物もきちんと定義しないと動かない。

たとえば、以下の書き方が出来ます。

例1:
var array = new Array();
array.push('aaa');
array.push('bbb');

例1はきちんと配列として扱っています。

例2:
var array = {};
array['a'] = 'aaa';
array['b'] = 'bbb';

例2はきちんと連想配列として扱っています。

例3:
var array = new Array();
array['a'] = 'aaa';
array['b'] = 'bbb';

例3は、書き方としてはアリなのでしょう。
しかし、jQuery.eachで処理すると正しく機能してくれません。

jQuery.eachは第一引数のobjectのlengthプロパティが有るかどうかを判断して
配列か連想配列なのかを判断しているようです。

例1のlengthは「2」、例2は「undefined」、例3は「0」が帰ってきます。
なので、入れ物の定義から配列なのか連想配列なのか正しく扱う必要があるようです。
変数の型はなくともobjectの型はきちんと定義しないとならないとは・・・。
コメント

No title

1は配列だけれど、2,3はプロパティのようなものだから、eachで列挙はしたくない気はする。

Re: No title

jQuery.eachをみると、"ength"が"undefined"の時は連想配列と判断してforin文を、
ある場合はfor文で処理するようになってる。
なので、例3は"length"が"0"なので処理されないという。

どう答えたらいいのか悩ましいが、jQueryつかって連想配列にセットした値をみたいのだけど、
他にいい方法が見つからず、といったところかなぁ。
サンプル類みるとJSONで返ってきた値をeachで見てたりするのよね。

昨今のJavaScriptは連想配列ばかりだから、forin文は罠だったりするね。
"document.getElementsByTagName"とか回すと大変なことに・・・。

今回はeachの仕様より、JavaScriptにも型(というかオブジェクト)の種類はきちんとあるんだな、
ということが分かったということで。
コメントの投稿
管理者にだけ表示を許可する