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

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

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

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

2回答

18621閲覧

Jsonのデータをループさせて特定の値を取り出したい

fujika

総合スコア6

JSON

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2018/05/13 15:26

前提・実現したいこと

初めての投稿になります。よろしくお願いいたします。
Jsonのデータをループさせて欲しいデータを抜き出したいと思いました。

Javascript

1[ 2 { 3 "day": "2018/04/30", 4 "high": "1039537", 5 "low": "1004541" 6 }, 7{ 8 "day": "2018/04/29", 9 "high": "1048158", 10 "low": "1000610" 11 }, 12 13/* ----- 中略 ----- */ 14 15 { 16 "day": "2018/04/01", 17 "high": "770192", 18 "low": "676906" 19 } 20];

という感じの4月の1か月分のデータです。
これを1か月毎に区切ったり、データが長くなれば3か月、6カ月、1年毎に区切ってその中の最大値や最小値のデータを抜き出したいと思っています。

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

まずはfor文を使ってデータを1週間ごとに区切ってから、1週間のhighの最大値とlowの最小値を取り出したいのですが、値の取り出し方がいまいちよく分かりませんでした。

該当のソースコード

Javascript

1var fs = require("fs"); 2// JSON 3var json = [ 4 { 5 "day": "2018/04/30", 6 "high": "1039537", 7 "low": "1004541" 8 }, 9 { 10 "day": "2018/04/29", 11 "high": "1048158", 12 "low": "1000610" 13 }, 14 { 15 "day": "2018/04/28", 16 "high": "1042000", 17 "low": "982147" 18 }, 19 { 20 "day": "2018/04/27", 21 "high": "1044772", 22 "low": "960676" 23 }, 24 { 25 "day": "2018/04/26", 26 "high": "1071110", 27 "low": "960690" 28 }, 29 { 30 "day": "2018/04/25", 31 "high": "1076648", 32 "low": "967815" 33 }, 34 { 35 "day": "2018/04/24", 36 "high": "1067674", 37 "low": "964904" 38 }, 39 { 40 "day": "2018/04/23", 41 "high": "988147", 42 "low": "947067" 43 }, 44 { 45 "day": "2018/04/22", 46 "high": "978223", 47 "low": "935823" 48 }, 49 { 50 "day": "2018/04/21", 51 "high": "974495", 52 "low": "891117" 53 }, 54 { 55 "day": "2018/04/20", 56 "high": "963122", 57 "low": "870957" 58 }, 59 { 60 "day": "2018/04/19", 61 "high": "896137", 62 "low": "853827" 63 }, 64 { 65 "day": "2018/04/18", 66 "high": "880135", 67 "low": "841612" 68 }, 69 { 70 "day": "2018/04/17", 71 "high": "898900", 72 "low": "841899" 73 }, 74 { 75 "day": "2018/04/16", 76 "high": "906178", 77 "low": "845470" 78 }, 79 { 80 "day": "2018/04/15", 81 "high": "898839", 82 "low": "846863" 83 }, 84 { 85 "day": "2018/04/14", 86 "high": "875603", 87 "low": "827362" 88 }, 89 { 90 "day": "2018/04/13", 91 "high": "878800", 92 "low": "725550" 93 }, 94 { 95 "day": "2018/04/12", 96 "high": "854537", 97 "low": "721461" 98 }, 99 { 100 "day": "2018/04/11", 101 "high": "744774", 102 "low": "712095" 103 }, 104 { 105 "day": "2018/04/10", 106 "high": "778178", 107 "low": "711808" 108 }, 109 { 110 "day": "2018/04/09", 111 "high": "780201", 112 "low": "716405" 113 }, 114 { 115 "day": "2018/04/08", 116 "high": "769416", 117 "low": "732451" 118 }, 119 { 120 "day": "2018/04/07", 121 "high": "761432", 122 "low": "699899" 123 }, 124 "day": "2018/04/06", 125 "high": "746511", 126 "low": "699204" 127 }, 128 { 129 "day": "2018/04/05", 130 "high": "789659", 131 "low": "708030" 132 }, 133 { 134 "day": "2018/04/04", 135 "high": "801088", 136 "low": "720637" 137 }, 138 { 139 "day": "2018/04/03", 140 "high": "802688", 141 "low": "723628" 142 }, 143 { 144 "day": "2018/04/02", 145 "high": "750759", 146 "low": "678044" 147 }, 148 { 149 "day": "2018/04/01", 150 "high": "770192", 151 "low": "676906" 152 } 153]; 154 155// 分割 156for (var i = 0; i < json.length; i += 7) { 157 fs.appendFile('./out.json', JSON.stringify(json[i], null, ' ')); 158} 159console.log("JSON形式で出力されました"); 160 161/* ----- 実行結果 ----- */ 162{ 163 "day": "2018/04/30", 164 "high": "1039537", 165 "low": "1004541" 166}{ 167 "day": "2018/04/23", 168 "high": "988147", 169 "low": "947067" 170}{ 171 "day": "2018/04/16", 172 "high": "906178", 173 "low": "845470" 174}{ 175 "day": "2018/04/09", 176 "high": "780201", 177 "low": "716405" 178}{ 179 "day": "2018/04/02", 180 "high": "750759", 181 "low": "678044" 182}

試したこと

とりあえず1週間分に区切ることだけはできたのですが、値の取り出し方がさっぱり分らず悩んでいます。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

JSON.stringify してファイルに書き込むところは一旦置いておくとして、こんな感じですかね。

ここ で実行できます。

実行結果

実行結果

サンプルコード

js

1const data = [ 2 { 3 "day": "2018/04/30", 4 "high": "1039537", 5 "low": "1004541" 6 }, 7 { 8 "day": "2018/04/29", 9 "high": "1048158", 10 "low": "1000610" 11 }, 12 { 13 "day": "2018/04/28", 14 "high": "1042000", 15 "low": "982147" 16 }, 17 { 18 "day": "2018/04/27", 19 "high": "1044772", 20 "low": "960676" 21 }, 22 { 23 "day": "2018/04/26", 24 "high": "1071110", 25 "low": "960690" 26 }, 27 { 28 "day": "2018/04/25", 29 "high": "1076648", 30 "low": "967815" 31 }, 32 { 33 "day": "2018/04/24", 34 "high": "1067674", 35 "low": "964904" 36 }, 37 { 38 "day": "2018/04/23", 39 "high": "988147", 40 "low": "947067" 41 }, 42 { 43 "day": "2018/04/22", 44 "high": "978223", 45 "low": "935823" 46 }, 47 { 48 "day": "2018/04/21", 49 "high": "974495", 50 "low": "891117" 51 }, 52 { 53 "day": "2018/04/20", 54 "high": "963122", 55 "low": "870957" 56 }, 57 { 58 "day": "2018/04/19", 59 "high": "896137", 60 "low": "853827" 61 }, 62 { 63 "day": "2018/04/18", 64 "high": "880135", 65 "low": "841612" 66 }, 67 { 68 "day": "2018/04/17", 69 "high": "898900", 70 "low": "841899" 71 }, 72 { 73 "day": "2018/04/16", 74 "high": "906178", 75 "low": "845470" 76 }, 77 { 78 "day": "2018/04/15", 79 "high": "898839", 80 "low": "846863" 81 }, 82 { 83 "day": "2018/04/14", 84 "high": "875603", 85 "low": "827362" 86 }, 87 { 88 "day": "2018/04/13", 89 "high": "878800", 90 "low": "725550" 91 }, 92 { 93 "day": "2018/04/12", 94 "high": "854537", 95 "low": "721461" 96 }, 97 { 98 "day": "2018/04/11", 99 "high": "744774", 100 "low": "712095" 101 }, 102 { 103 "day": "2018/04/10", 104 "high": "778178", 105 "low": "711808" 106 }, 107 { 108 "day": "2018/04/09", 109 "high": "780201", 110 "low": "716405" 111 }, 112 { 113 "day": "2018/04/08", 114 "high": "769416", 115 "low": "732451" 116 }, 117 { 118 "day": "2018/04/07", 119 "high": "761432", 120 "low": "699899" 121 }, 122 { 123 "day": "2018/04/06", 124 "high": "746511", 125 "low": "699204" 126 }, 127 { 128 "day": "2018/04/05", 129 "high": "789659", 130 "low": "708030" 131 }, 132 { 133 "day": "2018/04/04", 134 "high": "801088", 135 "low": "720637" 136 }, 137 { 138 "day": "2018/04/03", 139 "high": "802688", 140 "low": "723628" 141 }, 142 { 143 "day": "2018/04/02", 144 "high": "750759", 145 "low": "678044" 146 }, 147 { 148 "day": "2018/04/01", 149 "high": "770192", 150 "low": "676906" 151 } 152]; 153 154const weeks = []; 155 156for (i = 0; i < data.length; i += 7) { 157 const week = data.slice(i, 7 + i); 158 weeks.push(week); 159} 160 161console.log(weeks); 162 163const weeksSummary = weeks.map(week => ({ 164 maxHigh: Math.max(...week.map(data => data.high)), 165 minLow: Math.min(...week.map(data => data.low)), 166})); 167 168console.log(weeksSummary); 169 170weeksSummary.forEach((summary, weekNumber) => { 171 const message = `${weekNumber + 1}週目 最大値: ${summary.maxHigh}, 最小値: ${summary.minLow}`; 172 173 console.log(message); 174}); 175

投稿2018/05/16 15:06

og24715

総合スコア832

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

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

0

期間中のhighの最大値とlowの最小値は次のようにして取れます。

var partialData = [ { "high": "10", "low": "1" }, { "high": "20", "low": "2" }, { "high": "30", "low": "3" }, { "high": "40", "low": "4" }, { "high": "50", "low": "5" }, { "high": "60", "low": "6" } ] var highNumbers = partialData.map(data => parseInt(data.high)) // [ 10, 20, 30, 40, 50, 60 ] var highest = Math.max.apply(null, highNumbers) // 60 var lowNumbers = partialData.map(data => parseInt(data.low)) // [ 1, 2, 3, 4, 5, 6 ] var lowest = Math.min.apply(null, lowNumbers) // 1

それよりも気がかりなのが、貼られたコードで区間に区切れていないのではないでしょうか。

javascript

1for (var i = 0; i < json.length; i += 7) { 2 fs.appendFile('./out.json', JSON.stringify(json[i], null, ' ')); 3}

これだと「7日分を一区間とした形にデータを分割する」のではなく、「7日とばしに1日ずつサンプリングする」という実装になっています。

投稿2018/05/13 18:37

set0gut1

総合スコア2413

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問