前提・実現したいこと
クリックごとに { id: 1, name: 'a' } というオブジェクトを配列にして、クッキーに追加していく仕組みを作っています。
クッキーにはこのように配列を(そのJSON.stringify版を)保存したいです。
[ { id: 1, name: 'a' }, { id: 1, name: 'a' } ]
そしてこの保存において、何度目のクリックであっても配列を保存したいのですが、次の問題が発生します。
発生している問題
jQuery.cookieで配列を保存すると、1回目に勝手にオブジェクトになり、2回目以降に配列になるという問題に遭遇しました。
解決方法をご指南頂けましたら幸いです。
該当のソースコード
実際にクッキーが保存できるサンプルをご用意しました。
https://liveweave.com/wKgNZI
1回目はなぜかオブジェクトが保存され、2回目以降に配列が保存されることがご確認いただけるかと思います。
以下は上のリンクと同じコードになります。
html
1<!DOCTYPE html> 2<html> 3<head> 4<script type="text/javascript" src="https://code.jquery.com/jquery-latest.min.js"></script> 5</head> 6<body> 7<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script> 8<button type="button">update!</button> 9</body> 10</html>
下記6行目のコンソール表示は配列のかぎかっこ(これ→[])があるのに、7行目で勝手にオブジェクトに変換されてしまいます。この変換は1回目のクリックだけで、2回目以降はきちんと配列が保存され、オブジェクトになることはありません。
$(document).on('click','button', function(e){ const NewHistory = { id: 1, name: 'a' }; let HistoryAry = $.cookie( 'HistoryAry' ) ? JSON.parse( $.cookie( 'HistoryAry' ) ) : []; HistoryAry.unshift(NewHistory); HistoryAry = JSON.stringify(HistoryAry); console.log(HistoryAry); // ここは配列なのに $.cookie( 'HistoryAry', HistoryAry, { expires: 365, path:'/' } ); // ここでオブジェクトになる });
###試したこと
まず、HisToryAryを次のように変えても変化なしでした。
//let HistoryAry = $.cookie( 'HistoryAry' ) ? JSON.parse( $.cookie( 'HistoryAry' ) ) : []; let HistoryAry = JSON.parse( $.cookie( 'HistoryAry' ) ? $.cookie( 'HistoryAry' ) : '[]' );
また、HisToryAryの初期化の際に次のように空のオブジェクトをいれてみましたところ、1回目のクリックでも配列が保存されました。(もちろん不要な空のオブジェクトも保存されることになるのでこれはいけません)
let HistoryAry = $.cookie( 'HistoryAry' ) ? JSON.parse( $.cookie( 'HistoryAry' ) ) : [{}];
###バージョン
上で使用中のjquery.cookieは1.4.1です。