ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.
laravelでコレクションを「Js::from」というjavascriptで扱えるようにする関数で変換すると、通常は配列になるのに特定条件下ではオブジェクトに変換されてしまう事があります。
javascriptのオブジェクトではfilter関数が使えないので、配列に変換されたりオブジェクトに変換されたりと挙動が不安定なのは困りもの。
という事でここではlaravelの「Js::from」関数とコレクションを同時使用する際の注意点を書いておきますね。
また、「Js::from」はどうやらHTMLエスケープをしたのち、javascript側の関数である「JSON.parse」を呼んでるだけのようですので、コレクションと「JSON.parse」の組み合わせで同じく困ってる方も参考になると思います。
解決方法:コレクションは最後にvalues()を呼ぼう
まず最初に解決方法から。
コレクションをコントローラーとかでいろいろいじった後、一番最後に「values()」を呼んでください。これだけで解決します。
$filtered = $collection->reverse()->values();
上の例ではコレクションのデータをreverse関数で逆順にした後、valuesを呼んでます。
keyの値が連番じゃないとJSON.parseはオブジェクトに変換する
とりあえず解決方法に関してはもう書いたので、ここから先は理由を知りたい方だけ読んでくださいね。
…といいつつもうこの見出しに理由をすべて書いてしまっていますね。
そうなんです、まずこのjavascript側で配列になるのかオブジェクトになるのかはJSON.parseの処理によるもののようで、keyの値が0から連番になっているのであれば配列として変換し、keyが0から始まっていないときとか歯抜けになってる場合はオブジェクトとして変換するみたい。
なので、ただシンプルに作ったコレクションをそのまま「Js::from」に入れると配列になり、そのコレクションに対し何かしら処理を入れて歯抜けになったりした場合はオブジェクトになっちゃう、と。
上の解決策で使った「values()」はkeyの値を0から再度振りなおす、という関数となっているので、これを使う事で歯抜けになってしまったコレクションのkeyを0からの連番に戻せるんです。
まとめ
ここではlaravelのコレクションを「Js::from」で変換した際、通常であれば配列に変換されるのに特定条件下でオブジェクトに変換されてしまう事がある事、またそれを防ぐための解決方法を紹介しました。
結局連番じゃないとオブジェクトにしちゃうよー!という事になってるので、コレクションをいろいろいじった後にvalues()関数を呼んで連番にすればいい、というコトでした。
参考にしてみてくださいね。
【おしらせ、というか完全なる宣伝】
文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.
こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /

