🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

7448閲覧

JSでJSON.stfingifyしても、配列が文字列に変換できない

kaminarikun

総合スコア8

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/11/03 11:34

前提・実現したいこと

以下の連想配列(JSオブジェクト)を、クッキーに保存したいです。

{ key1: true, key2: false }

発生している問題・エラーメッセージ

JSON.stfingifyしても、配列が文字列に変換できません。

該当のソースコード

おおまかな流れですが、このような感じです。以下ですとクッキーの保存にそのまま配列を入れているので当然ダメです。

そこで「試したこと」にあるコードを実行しましたが、いずれもダメでした。

js

1const key1 = 'key1'; 2const key2 = 'key2'; 3let data = []; 4data[key1] = true; 5data[key2] = false; 6$.cookie( 'data', data ); // 文字列で保存しなければならないのでダメ

試したこと

ざっと思いついたものは下記のように試したのですが、コメントアウトしてある通りできませんでした。

正しい処理や他に試すことをご存じの方いらっしゃいますでしょうか?

js

1console.log( data ); // 正しい形式だがクッキーは保存できない 2console.log( data.join(',') ); // null になってしまう 3console.log( JSON.stringify(data) ); // []になってしまう 4console.log( JSON.stringify(data,null,'\t') ); // []になってしまう

補足情報(FW/ツールのバージョンなど)

クッキーの保存には以下のプラグインを使用しております。
jquery.cookie.js v1.4.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

自由なキーで保存したいのなら、let data = {}とオブジェクトにしてください。

[]で作った配列にも文字列の名前のキーで値を格納すること自体はできますが、JSON.stringifyするとそれらはすべて無視されます

投稿2019/11/03 11:54

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaminarikun

2019/11/04 07:04

JSON.stringify() は配列に使えないんですね。ありがとうございました。他の方へのコメントも参考になりました。
guest

0

ベストアンサー

jQuery.cookie

まず、公式ドキュメントを読んでください。
jQuery.cookie はオプション(json)を指定すれば、「JSONに変換可能なオブジェクト」を格納できます。

json

Turn on automatic storage of JSON objects passed as the cookie value. Assumes JSON.stringify and JSON.parse:

JavaScript

1$.cookie.json = true;

new Map

次に、JavaScriptに連想配列はありません
配列的な機構が必要なら、new Map を使用して下さい。

JavaScript

1'use strict'; 2jQuery.cookie.json = true; // Turn on automatic storage of JSON objects passed as the cookie value. Assumes JSON.stringify and JSON.parse: 3 4jQuery.cookie('data', [['key1', true], ['key2', false]]); // Create session cookie: 5 6const map = new Map(jQuery.cookie('data')); // Read cookie: 7 8console.log(map.get('key1')); // true 9console.log(map.get('key2')); // false

map に書き込んだデータを Cookie に書き戻すには、Array.from で二次元配列に変換します。

JavaScript

1map.set('key1', false); 2map.set('key2', true); 3 4jQuery.cookie('data', Array.from(map)); // Create session cookie:

Re: kaminarikun さん

投稿2019/11/03 23:35

編集2019/11/04 01:23
think49

総合スコア18189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/11/04 00:44

MapはJavaScript内で使うには結構便利なんですが、JSONとの相性が悪すぎるのがこの場面ではネックになりそうです。
think49

2019/11/04 01:14

@maisumakun さん new Mapは二次元配列と相互変換可能なので、JSONとの相互変換にも支障がないと考えています。 const array = [['key1', true], ['key2', false]], map = new Map(array); console.log(JSON.stringify(array) === JSON.stringify(Array.from(map))); // true
kaminarikun

2019/11/04 07:01

詳細にありがとうございます。ドキュメント読まないといけませんね。普通に使えたとは知りませんでした。 Mapの使い方も詳しくありがとうございます。勉強になりました。
guest

0

質問のコードは配列オブジェクト(data)のプロパティを追加定義する処理になっています。

javascript

1data[key1] = true; // {Array}.key1 = true, 配列内は [] のまま 2:

JSON.stringify() は 配列オブジェクトのプロパティを評価しないため、結果が空の配列になります。

ご所望の結果を得るには、数値添字か、data.push( key ) ですね。
試すことを書きましたが、既に正答が示されていますね。

投稿2019/11/03 22:39

編集2019/11/03 22:49
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaminarikun

2019/11/04 07:03

JSON.stringify() は配列に使えないんですね。ありがとうございました。
AkitoshiManabe

2019/11/04 07:07

配列に使えないのではなく、配列要素だけを評価するんです。
guest

0

const d1 = [] d1.key1 = true d1.key2 = false d1.__proto__.constructor >>> ƒ Array() { [native code] } JSON.stringify(d1) // NG

この書き方で生成されるのは配列オブジェクトであり、~~JSON.stringify()の引数として正しくありません。
JSON.stringify()の引数は純粋なJavaScriptオブジェクトである必要があるため、~~以下のように記述します。

const d2 = {} d2.key1 = true d2.key2 = false d2.__proto__.constructor >>> ƒ Object() { [native code] } JSON.stringify(d2) // OK

投稿2019/11/03 12:15

編集2019/11/03 12:26
sfwlma

総合スコア52

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/11/03 12:19

配列も数値添字であれば、問題なくJSON.stringifyできます(配列型もJSONに存在する型の1つです)。
sfwlma

2019/11/03 12:23

そうなんですね。 勉強になりました。 失礼しました。
kaminarikun

2019/11/04 07:03

いまいち配列とオブジェクトが区別できてませんでした。ありがとうございました。
guest

0

data.join(',')してからJSON.stringify(data)しているから空配列になっているだけだと思います。

js

1// console.log( data.join(',') ); // null になってしまう 2 console.log( JSON.stringify(data) ); // []になってしまう

投稿2019/11/03 11:49

編集2019/11/03 12:04
kei344

総合スコア69596

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/11/03 11:55

.joinは破壊的なメソッドではなく、別に文字列を生成します。
kei344

2019/11/03 12:04

To: maisumakunさん あ、「let data = [];」だから「[]になってしまう」ですね。
kaminarikun

2019/11/04 07:04

ご説明ありがとうございます。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問