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

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

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

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

JavaScript

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

Q&A

3回答

912閲覧

JSONを用いての判別法

chibiyuko_0124

総合スコア18

JSON

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

JavaScript

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

0グッド

1クリップ

投稿2018/11/22 03:53

編集2022/01/12 10:55

お世話になっております。
jsonを、下記の条件で出力したいと思っています。

  • 表示したい値:nameがappleのdata(テキスト部分)
  • 表示期間:2018/12/01 X時〜1018/12/31 X時 まで
  • X時について:timeに入力してある時間を最優先、空欄ならばtime2

その際の判別法がでつまずいております。
開始日のX時以降表示、終了時日のX時以降非表示の処理ができておりません。

{{ "start_day":"2018-12-01", "end_day":"2018-12-31", "time":"11:00:00", "name":"apple", "data":"テキスト" }, { "start_day":"2018-11-15", "end_day":"2018-11-30", "time":"", "name":"apple" "data":"テキスト" }, { "start_day":"2018-10-01", "end_day":"2018-10-31", "time":"10:00:00"; "name":"cake" "data":"テキスト" }} var time2 = '16:00:00'; var now_date = newDateでy-m-dにフォーマット var now_time = newDateでh:i:sにフォーマット

書きかけのソースです。
開始日のX時以降表示、終了時日のX時以降非表示とするにはどうすれば良いでしょうか。

//期間を指定 これだけではX時に関係なく出てしまうので… if(now_date >= start_day && now_date <= end_day { // start_day当日の場合 timeに値があり、現在時間を過ぎている または timeに値がなく、time2が現在時間を過ぎている if(time && now_time >= time || time == false && now_time >= time2) { //nameがappleの場合に表示 if(name.indexOf(‘apple’) != -1) { document.write(data); } } }

アドバイスをいただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

moment.jsを使うと簡単かと思います。

javascript

1var time2 = '16:00:00'; 2var json = [ 3 { 4 "start_day": "2018-12-01", 5 "end_day": "2018-12-31", 6 "time": "11:00:00", 7 "name": "apple", 8 "data": "テキスト" 9 }, 10 { 11 "start_day": "2018-11-15", 12 "end_day": "2018-11-30", 13 "time": "", 14 "name": "apple", 15 "data": "テキスト" 16 }, 17 { 18 "start_day": "2018-10-01", 19 "end_day": "2018-10-31", 20 "time": "10:00:00", 21 "name": "cake", 22 "data": "テキスト" 23 } 24]; 25 26json.some(function(item) { 27 var time = item.time || time2; 28 var startAt = item.start_day + " " + time; 29 var endAt = item.end_day; + " " + time 30 var isBetween = moment().isBetween(startAt, endAt); 31 if (isBetween && item.name === 'apple') { 32 document.write(item.data); 33 } 34});

投稿2018/11/22 05:06

編集2018/11/22 05:26
monzy

総合スコア85

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

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

0

表示したい値:nameがappleのdata(テキスト部分)

dataってのは「情報の集合」を指す複数形の英単語ですが、
(テキスト)ってどういうことやねん。

JavaScript

1{{ 2"start_day":"2018-12-01", 3"end_day":"2018-12-31", 4"time":"11:00:00", 5"name":"apple", 6"data":"テキスト" 7},

このデータ、Chromeのデベロッパーツールにコピペすると構文エラーが出ますが、本当に正しいものですか?
仮に正しくても{{で始まっている架空のオレオレデータ、
仮に動いてもES6のコードブロックで挟まれた特殊なデータになりそうですが…

多分、[{}, {}, {}]のオブジェクトの配列のTYPOじゃないかと思いますので、
以降はこれを前提として回答していきます。

var now_date = newDateでy-m-dにフォーマット

var now_time = newDateでh:i:sにフォーマット

今日と言いたいのなら「today」、今と言いたいのなら「now」という変数名にしたほうが良いのでは?

その際の判別法がでつまずいております。

こういう処理はテキスト文字列ではなく、
「開始、現在、終了」のDateTimeの値を3つ作って、サンドイッチ的な比較をするのが最も楽です。

式にするとこう、誰の目にも明らかですよね?
if (start < now && now < end) {

ところが、日時文字列からDateTimeを作るのはJavaScriptは弱く、各種ブラウザで動いたり動かなかったりするのでその部分を吸収してくれるライブラリのMoment.jsを使いましょう。
試すにはこのサイトを使いましょう。
(try moment.jsでぐぐると出てきます)

JavaScript

1var now = moment('2018-12-01 05:06:18'); 2console.log(now.format('YYYY-MM-DD HH:mm:ss')); 3// 2018-12-01 05:06:18

試しにそのサイトでこう入力してRunボタンを押すと、デベロッパーツールのコンソールに結果が帰ってきました。
この調子でstart, now, endの3つのデータをMoment形式で作っていきましょう。

JavaScript

1var datum = { 2 "start_day":"2018-12-01", 3 "end_day":"2018-12-31", 4 "time":"11:00:00", 5 "name":"apple", 6 "data":"テキスト" 7}; 8var time = "16:00:00"; 9var start = moment(datum.start_day + ' ' + (datum.time || time)); 10var now = moment(); 11var end = moment(datum.end_day + ' ' + (datum.time || time));

開始日のX時以降表示、終了時日のX時以降非表示

上記の通りサンドイッチにすれば良いですが、Moment.jsはmoment同士の比較ができます。
これで開始時刻より現在時刻が後、みたいなAND条件で絞っても良いのですが、Moment.jsのドキュメント内のQueryで探すともっとそんまんまなメソッドを見つけました。

その名もisBetweenです。
ちょっとこれ使ってみましょう。

JavaScript

1var datum = { 2 "start_day":"2018-12-01", 3 "end_day":"2018-12-31", 4 "time":"11:00:00", 5 "name":"apple", 6 "data":"テキスト" 7}; 8var time = "16:00:00"; 9var start = moment(datum.start_day + ' ' + (datum.time || time)); 10var now = moment(); 11var end = moment(datum.end_day + ' ' + (datum.time || time)); 12 13console.log(now.isBetween(start, end)); 14// 実行結果は自分で確かめてみてね。

投稿2018/11/22 05:15

miyabi-sun

総合スコア21158

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

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

0

推測ですが、こういうことをされたいのでしょうか。
chromeのログ出力関数を使用しているので試す場合はchromeのコンソールに張り付けてください。

javascript

1var json = [{ 2"start_day":"2018-12-01", 3"end_day":"2018-12-31", 4"time":"11:00:00", 5"name":"apple", 6"data":"テキスト" 7}, 8{ 9"start_day":"2018-11-15", 10"end_day":"2018-11-30", 11"time":"", 12 "name":"apple", 13"data":"テキスト" 14}, 15{ 16"start_day":"2018-10-01", 17"end_day":"2018-10-31", 18"time":"10:00:00", 19 "name":"cake", 20"data":"テキスト" 21}] 22 23var time2 = '16:00:00'; 24var now_date = new Date(); 25for (var i in json){ 26 record=json[i]; 27 //jsonのiレコード目のstart_dayを日付型で取得する 28 start_time = new Date(record.start_day+" "+(record.time==""? time2:record.time)); 29 //jsonのiレコード目のend_dayを日付型で取得する 30 end_time = new Date(record.end_day+" "+(record.time==""? time2:record.time)); 31 //jsonのiレコード目に関して、現在日時がstartとendの間に含まれていれば表示する 32 if(now_date >= start_time && now_date <= end_time && record.name=="apple"){ 33 console.log("このデータは表示する"); 34 console.log(record); 35 }else{ 36 console.log("このデータは表示しない"); 37 console.log(record); 38 } 39}

投稿2018/11/22 04:53

Kaninippa

総合スコア56

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問