質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

Q&A

解決済

1回答

1452閲覧

取得したJSONデータをランダムにHTML上に出力させたい

s_ogawa

総合スコア38

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/07/31 00:02

編集2018/07/31 06:00

下記のようにjQueryで外部のJSONデータをfor in文でHTML内に出力させている状態で、JSONに記述している順番ではなくランダムに出力させたいのですが、どのようなロジックで処理すればいいかがわからず悩んでいます。

【HTML(js)】

〜 一部抜粋 〜 <ul id="wrap"> <script> $(function(){ $.getJSON("./sample.json",function(list){ for(var i in list) { var h = '<li>' + list[i].area + '<ul>'; for(var j in list[i].city){ h += '<li>' + list[i].city[j].name + '</li>'; } h += '</ul>' + '</li>'; $("#wrap").append(h); } }); }); </script> </ul>

【JSON】

[ { "area": "東北", "city": [ {"name": "青森"}, {"name": "秋田"}, {"name": "盛岡"}, {"name": "仙台"} ] }, { "area": "関東", "city": [ {"name": "東京"}, {"name": "埼玉"}, {"name": "千葉"} ] }, { "area": "近畿", "city": [ {"name": "大阪"}, {"name": "神戸"}, {"name": "京都"} ] } ]

【出力後のHTML】

<ul id="wrap"> <li>東北 <ul> <li>青森</li> <li>秋田</li> <li>盛岡</li> <li>仙台</li> </ul> </li> <li>関東 <ul> <li>東京</li> <li>埼玉</li> <li>千葉</li> </ul> </li> <li>近畿 <ul> <li>大阪</li> <li>京都</li> <li>神戸</li> </ul> </li> </ul>

配列の値をランダムに表示させるようにしたところ、変数hに入っている文字「<、u、l、」単位でランダムに表示されてしまい、for文でループさせているブロック(id="wrap"直下のli要素)単位で表示させるのが実現したいことです。そもそも、上記のようなアプローチではなく他の方法を検討する必要があるのかもしれませんが、、

id="wrap"直下のli要素の並びをランダムに表示させるようにしたいのですが、どのようにすればいいのかご教授いただけますと幸いです。


【解決後のjs】

<script> $(function(){ $.getJSON("./sample.json",function(list){ var arry = list; var numbers = []; for (var i = 0; i < arry.length; i++) { numbers.push(Math.random()); } var atRandom = arry.sort(function (a, b) { return numbers[arry.indexOf(a)] - numbers[arry.indexOf(b)]; }); for(var i in atRandom) { var h = '<li>' + atRandom[i].area + '<ul>'; for(var j in atRandom[i].city){ h += '<li>' + atRandom[i].city[j].name + '</li>'; } h += '</ul>' + '</li>'; $("#wrap").append(h); } }); }); </script>

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

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

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

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

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

guest

回答1

0

ベストアンサー

配列を並び替えるにはsortを使います。
参考サイト: Array.prototype.sort()

えっ、ランダムにしたいのにsortじゃ無理?
言いたい事はわかりますがまずは聞いてください。

sortメソッドにはソート順決定のアルゴリズムとしてコールバック関数を埋め込む事が可能です。

JavaScript

1function compare(a, b) { 2 if (ある順序の基準において a が b より小) { 3 return -1; 4 } 5 if (その順序の基準において a が b より大) { 6 return 1; 7 } 8 // a は b と等しいはず 9 return 0; 10}

Math.random()で同じ要素数のランダムな数値の配列を別途用意してやって…
これをソートの定義表として利用すれば良いのです。

JavaScript

1var list = [ 2 {area: "東北", city: [{name: "青森"}, {name: "秋田"}, {name: "盛岡"}, {name: "仙台"}]}, 3 {area: "関東", city: [{name: "東京"}, {name: "埼玉"}, {name: "千葉"}]}, 4 {area: "近畿", city: [{name: "大阪"}, {name: "神戸"}, {name: "京都"}]} 5]; 6// ランダムな値の配列を用意 7var numbers = []; 8for (var i = 0; i < list.length; i++) { 9 numbers.push(Math.random()); 10} 11var atRandom = list.sort(function (a, b) { 12 return numbers[list.indexOf(a)] - numbers[list.indexOf(b)]; 13}) 14 15console.log(numbers); // [0.3628977291901645, 0.6156880969149652, 0.42720050635830575] 16console.log(atRandom); // [{東北}, {近畿}, {関東}]

あれ? 「li要素の並びをランダムに表示させるようにしたい」んですか?
回答文のコードは大本の地方名をランダムに並べ替えてしまったので、ちょっと違いますが、
やるべき事は全く一緒のはずなので頑張って実装してみてくださいね。

投稿2018/07/31 02:19

miyabi-sun

総合スコア21158

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

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

miyabi-sun

2018/07/31 02:27

因みに今回ソートのコールバック関数内でlist.indexOf(a)としていますが、 これはlistが`オブジェクトの配列`だから成り立っています。 もし文字列や数値かつ、同じ値が複数存在する場合、このコードでランダムに並び替えようとしてもうまく動かなさそうです。 また別途値と乱数をセットにした配列を用意する流れになりますが、コードの難度がかなり上がりますので割愛しました。
s_ogawa

2018/07/31 05:52

早速のご返答、ご教授ありがとうございます。 教えていただいたソースコードのそのままコピペで恐縮ですが、見事に希望する要件が実現できました。 (教えていただいたのソースコードを追記したものを本文に更新しています) 恥ずかしながら、配列を並び替えるというところに至らなかったため、大変勉強になりました。 追記でいただいておりました下記の部分については今回は外部のJSONファイルでデータを取り扱う前提のため、問題なさそうです。詳細ありがとうございました。 素早く問題が解決でき感謝しております、まだまだ勉強していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問