javascriptの配列回して気づけばオーバーフロー?そんな時はsliceメソッドで配列をコピー!
初めまして。
BLUECODEのひーくんです。
最近暑いですね。早くもクーラーつけまくりで若干体調悪めです。
話は変わりますが、当ブログでは我々が開発している上で出てきたプチ技術TIPSみたいなものを書いていきたいと思ってます。
とは言っても我々も若輩者なのでプッチプチなものになるかとは思いますが、
我々と同じような「アプリでも作ってみるかほげ〜っ(※ただし技術力はない」みたいな初心者の方に何か少しでもプラスになる知識を共有して共に成長できたらなといった内容です。
もとい熟練プログラマーの先輩方のご意見やご指導ご鞭撻の程をいただけたらこれ程幸せなことはないので、ぜひよろしくお願い致します。
では早速ですが今回は「javascriptの配列回して気づけばオーバーフロー?そんな時はsliceメソッドで配列をコピー!」を紹介します。
まぁオカモがやらかしたソースなんですけどね(笑)
Yourshelfの開発で、「Listが二つあって、hogeListにないものだけfugaListから抽出してhogeListに追加したい」といった場面があったんですけど。っていうかまぁよくある話だと思うんですけど。
こんな感じのソースが書かれてたんですよ。
fugaListを回しているのにその中でfugaListに何か追加している…だと…こいつファンキーだぜ…(ゴクリッ
デバックしたらなんかよくわからないですけどfugaListが1周するごとに倍になって最終的に800万個くらい中身できて落ちてワロタ。
しょーがない直してやるかーで「1回fugaListをtempListに入れてtempListで回してfugaListに追加するけ〜」とひーくん起動したんですね。
まぁこんな感じで。
さて直した直した。デバッグしよ。
「fugaList中身800万個。オーバーフロー」
ファッ!?
javascriptではオブジェクトと配列は参照渡しなのですね(⊃д⊂)
ってか普段仕事でjavaやってるんですけどjavaでもそうですよね。僕大丈夫ですかね。
最終的にはjavascriptのslice()というメソッドを使う事でfugaListをtmpListにコピーする事で解決しました。
slice()は配列を引数で指定した開始位置から終了位置で新しい配列として生成してくれるメソッドなんですね。世の中便利ですね。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
こいつを引数なしで使う事でただfugaListをtmpListにコピーしちゃいました。
ただこの方法もあんまりスマートではなさそうですね。
もっと簡単にこうしたらいいよって方法があったら教えてください。
まぁこういった当たり前やん…みたいな事でも我々のような若輩者は知らなかったりするのでどこかで一人くらい見て役立ててくれるかもしれない同じ様な境遇の方に向けて書いてみました。
ちょっとずつ成長してみなさんにもっと有益な情報を届けられたらと思いますが、我々を育てるつもりで長い目でご閲覧ください。
以上、ひーくんの初投稿でした。