連想配列としてオブジェクトを使いたい

純粋な連想配列として JavaScript のオブジェクトを使う方法.
2
Atsushi Takayama @edvakf

入ってきた英単語をキーにするオブジェクトを作って tokens[token]++ とかやってたら、token が "constructor" だったのでエラー出てた。まったく予期してなかった。コノ JavaScript 野郎が…

2010-11-17 19:50:09
Atsushi Takayama @edvakf

{__proto__:null} にしようかな。あんまり __proto__ とか使いたくないんだけど。

2010-11-17 19:50:38
Atsushi Takayama @edvakf

@os0x それ昔に読んだ時は理解できませんでしたがようやくわかりました。if (!tokens.hasOwnProperty(token)) {tokens[token] = [];} tokens[token].push(pkey); を一文で書けたらいいんですが。

2010-11-17 23:06:55
shogo ohta @os0x

@edvakf (tokens[token]&&!blank[token]&&tokens[token].push(pkey)) || (tokens[token]=[pkey]); //blankは空Object。空ObjectはhasOwnPropの代わりになるというネタです

2010-11-18 10:13:24
Atsushi Takayama @edvakf

@os0x またおもしろいのを。それだと blank を何度も作らないといけませんね。

2010-11-18 10:46:06
shogo ohta @os0x

@edvakf blankはループの外で一度定義すれば大丈夫ですよ

2010-11-18 10:49:02
Atsushi Takayama @edvakf

@os0x あ、間違えました。token が 'constructor' だったら2回目以降 !blank[token] が false になって tokens[token]=[pkey] してしまいます。http://jsfiddle.net/f6x3Q/

2010-11-18 10:56:00
Yosuke HASEGAWA @hasegawayosuke

難しいことわからんので、僕なら tokens[token+"#"] = ++tokens[token+"#"] || 1; で逃げる。

2010-11-18 10:59:38
Yosuke HASEGAWA @hasegawayosuke

「ハッシュのキーにprefixつけてる前提ならどちらにしろ気にしないでいいけど。 」て書いてた。

2010-11-18 11:00:39
Atsushi Takayama @edvakf

@hasegawayosuke 三千万トークンあるのでシンプルにやりたかったのです。{__proto__:null} が一番シンプルだと思いますが、__proto__ は使いたくないのでもう .hasOwnProperty でやることにしました。

2010-11-18 11:01:08
shogo ohta @os0x

@edvakf あー、毎回初期化の方になっちゃうか。結局、配列かどうか検証しないとダメでしたね…

2010-11-18 11:22:32
shogo ohta @os0x

@edvakf ブラウザ限定ならObject.create(null) が__proto__:null 相当ですよ

2010-11-18 11:23:30
Atsushi Takayama @edvakf

@os0x あ、それは知りませんでした。IE はそれにすればよさそうですね。

2010-11-18 11:39:41
Atsushi Takayama @edvakf

@os0x あ、WebSQLDabase なので IE は最初っからありえませんでしたw

2010-11-18 11:40:23