Jsonのデータをループさせて特定の値を取り出したい
受付中
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,883
前提・実現したいこと
初めての投稿になります。よろしくお願いいたします。
Jsonのデータをループさせて欲しいデータを抜き出したいと思いました。
[
{
"day": "2018/04/30",
"high": "1039537",
"low": "1004541"
},
{
"day": "2018/04/29",
"high": "1048158",
"low": "1000610"
},
/* ----- 中略 ----- */
{
"day": "2018/04/01",
"high": "770192",
"low": "676906"
}
];
という感じの4月の1か月分のデータです。
これを1か月毎に区切ったり、データが長くなれば3か月、6カ月、1年毎に区切ってその中の最大値や最小値のデータを抜き出したいと思っています。
発生している問題・エラーメッセージ
まずはfor文を使ってデータを1週間ごとに区切ってから、1週間のhighの最大値とlowの最小値を取り出したいのですが、値の取り出し方がいまいちよく分かりませんでした。
該当のソースコード
var fs = require("fs");
// JSON
var json = [
{
"day": "2018/04/30",
"high": "1039537",
"low": "1004541"
},
{
"day": "2018/04/29",
"high": "1048158",
"low": "1000610"
},
{
"day": "2018/04/28",
"high": "1042000",
"low": "982147"
},
{
"day": "2018/04/27",
"high": "1044772",
"low": "960676"
},
{
"day": "2018/04/26",
"high": "1071110",
"low": "960690"
},
{
"day": "2018/04/25",
"high": "1076648",
"low": "967815"
},
{
"day": "2018/04/24",
"high": "1067674",
"low": "964904"
},
{
"day": "2018/04/23",
"high": "988147",
"low": "947067"
},
{
"day": "2018/04/22",
"high": "978223",
"low": "935823"
},
{
"day": "2018/04/21",
"high": "974495",
"low": "891117"
},
{
"day": "2018/04/20",
"high": "963122",
"low": "870957"
},
{
"day": "2018/04/19",
"high": "896137",
"low": "853827"
},
{
"day": "2018/04/18",
"high": "880135",
"low": "841612"
},
{
"day": "2018/04/17",
"high": "898900",
"low": "841899"
},
{
"day": "2018/04/16",
"high": "906178",
"low": "845470"
},
{
"day": "2018/04/15",
"high": "898839",
"low": "846863"
},
{
"day": "2018/04/14",
"high": "875603",
"low": "827362"
},
{
"day": "2018/04/13",
"high": "878800",
"low": "725550"
},
{
"day": "2018/04/12",
"high": "854537",
"low": "721461"
},
{
"day": "2018/04/11",
"high": "744774",
"low": "712095"
},
{
"day": "2018/04/10",
"high": "778178",
"low": "711808"
},
{
"day": "2018/04/09",
"high": "780201",
"low": "716405"
},
{
"day": "2018/04/08",
"high": "769416",
"low": "732451"
},
{
"day": "2018/04/07",
"high": "761432",
"low": "699899"
},
"day": "2018/04/06",
"high": "746511",
"low": "699204"
},
{
"day": "2018/04/05",
"high": "789659",
"low": "708030"
},
{
"day": "2018/04/04",
"high": "801088",
"low": "720637"
},
{
"day": "2018/04/03",
"high": "802688",
"low": "723628"
},
{
"day": "2018/04/02",
"high": "750759",
"low": "678044"
},
{
"day": "2018/04/01",
"high": "770192",
"low": "676906"
}
];
// 分割
for (var i = 0; i < json.length; i += 7) {
fs.appendFile('./out.json', JSON.stringify(json[i], null, ' '));
}
console.log("JSON形式で出力されました");
/* ----- 実行結果 ----- */
{
"day": "2018/04/30",
"high": "1039537",
"low": "1004541"
}{
"day": "2018/04/23",
"high": "988147",
"low": "947067"
}{
"day": "2018/04/16",
"high": "906178",
"low": "845470"
}{
"day": "2018/04/09",
"high": "780201",
"low": "716405"
}{
"day": "2018/04/02",
"high": "750759",
"low": "678044"
}
試したこと
とりあえず1週間分に区切ることだけはできたのですが、値の取り出し方がさっぱり分らず悩んでいます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
期間中の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
それよりも気がかりなのが、貼られたコードで区間に区切れていないのではないでしょうか。
for (var i = 0; i < json.length; i += 7) {
fs.appendFile('./out.json', JSON.stringify(json[i], null, ' '));
}
これだと「7日分を一区間とした形にデータを分割する」のではなく、「7日とばしに1日ずつサンプリングする」という実装になっています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
JSON.stringify してファイルに書き込むところは一旦置いておくとして、こんな感じですかね。
ここ で実行できます。
実行結果
サンプルコード
const data = [
{
"day": "2018/04/30",
"high": "1039537",
"low": "1004541"
},
{
"day": "2018/04/29",
"high": "1048158",
"low": "1000610"
},
{
"day": "2018/04/28",
"high": "1042000",
"low": "982147"
},
{
"day": "2018/04/27",
"high": "1044772",
"low": "960676"
},
{
"day": "2018/04/26",
"high": "1071110",
"low": "960690"
},
{
"day": "2018/04/25",
"high": "1076648",
"low": "967815"
},
{
"day": "2018/04/24",
"high": "1067674",
"low": "964904"
},
{
"day": "2018/04/23",
"high": "988147",
"low": "947067"
},
{
"day": "2018/04/22",
"high": "978223",
"low": "935823"
},
{
"day": "2018/04/21",
"high": "974495",
"low": "891117"
},
{
"day": "2018/04/20",
"high": "963122",
"low": "870957"
},
{
"day": "2018/04/19",
"high": "896137",
"low": "853827"
},
{
"day": "2018/04/18",
"high": "880135",
"low": "841612"
},
{
"day": "2018/04/17",
"high": "898900",
"low": "841899"
},
{
"day": "2018/04/16",
"high": "906178",
"low": "845470"
},
{
"day": "2018/04/15",
"high": "898839",
"low": "846863"
},
{
"day": "2018/04/14",
"high": "875603",
"low": "827362"
},
{
"day": "2018/04/13",
"high": "878800",
"low": "725550"
},
{
"day": "2018/04/12",
"high": "854537",
"low": "721461"
},
{
"day": "2018/04/11",
"high": "744774",
"low": "712095"
},
{
"day": "2018/04/10",
"high": "778178",
"low": "711808"
},
{
"day": "2018/04/09",
"high": "780201",
"low": "716405"
},
{
"day": "2018/04/08",
"high": "769416",
"low": "732451"
},
{
"day": "2018/04/07",
"high": "761432",
"low": "699899"
},
{
"day": "2018/04/06",
"high": "746511",
"low": "699204"
},
{
"day": "2018/04/05",
"high": "789659",
"low": "708030"
},
{
"day": "2018/04/04",
"high": "801088",
"low": "720637"
},
{
"day": "2018/04/03",
"high": "802688",
"low": "723628"
},
{
"day": "2018/04/02",
"high": "750759",
"low": "678044"
},
{
"day": "2018/04/01",
"high": "770192",
"low": "676906"
}
];
const weeks = [];
for (i = 0; i < data.length; i += 7) {
const week = data.slice(i, 7 + i);
weeks.push(week);
}
console.log(weeks);
const weeksSummary = weeks.map(week => ({
maxHigh: Math.max(...week.map(data => data.high)),
minLow: Math.min(...week.map(data => data.low)),
}));
console.log(weeksSummary);
weeksSummary.forEach((summary, weekNumber) => {
const message = `第${weekNumber + 1}週目 最大値: ${summary.maxHigh}, 最小値: ${summary.minLow}`;
console.log(message);
});
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる