Array + Set で検索を高速に
Array#indexOf(item) !== -1
をやって存在を確認するのが、どうにも速い気がしなくてやってみた。
とりあえず、Array.indexOf vs Set.has · jsPerfで速度確認。Set#has
が圧倒的に速い。
かと言って、単純な Set では以下の点で使いづらい
- 値の順番操作が面倒
- 入っている値に直にアクセスすることができない
ということで、配列的なんだけど、内部にSetオブジェクトを持ったものを作ってみた
- https://gist.github.com/teramako/4970442
- ECMAScript.next なのがたくさん入っているので、今のところ、Firefoxでないと動かないと思う
- 値があるかどうかの確認は高速(
UniqArray#has
の使用)- それ以外の操作は余計な処理をするので遅くなりそう
- 値の重複は許さない(メリットでありデメリットでもある)
- Setオブジェクトに値を突っ込むことになるので、メモリを食うかも?
delete
演算子で、delete uniqArray[0]
とかやると整合性が取れなくなる- Proxy を使って
delete
に対してトラップすればいけるが、そこまでやる必要がある? - とりあえず、
delete
は禁止
- Proxy を使って