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

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

ただいまの
回答率

88.64%

JSONを用いての判別法

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 415

chibiyuko_0124

score 18

お世話になっております。
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);
}
}
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

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

var time2 = '16:00:00';
var json = [
    {
        "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": "テキスト"
    }
];

json.some(function(item) {
  var time = item.time || time2;
  var startAt = item.start_day + " " + time;
  var endAt = item.end_day; + " " + time
  var isBetween = moment().isBetween(startAt, endAt);
  if (isBetween && item.name === 'apple') {
    document.write(item.data);
  }
});

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

{{
"start_day":"2018-12-01",
"end_day":"2018-12-31",
"time":"11:00:00",
"name":"apple",
"data":"テキスト"
},

このデータ、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でぐぐると出てきます)

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

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

var datum = {
  "start_day":"2018-12-01",
  "end_day":"2018-12-31",
  "time":"11:00:00",
  "name":"apple",
  "data":"テキスト"
};
var time = "16:00:00";
var start = moment(datum.start_day + ' ' + (datum.time || time));
var now   = moment();
var end   = moment(datum.end_day + ' ' + (datum.time || time));

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

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

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

var datum = {
  "start_day":"2018-12-01",
  "end_day":"2018-12-31",
  "time":"11:00:00",
  "name":"apple",
  "data":"テキスト"
};
var time = "16:00:00";
var start = moment(datum.start_day + ' ' + (datum.time || time));
var now   = moment();
var end   = moment(datum.end_day + ' ' + (datum.time || time));

console.log(now.isBetween(start, end));
// 実行結果は自分で確かめてみてね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

var json = [{
"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 = new Date();
for (var i in json){
    record=json[i];
    //jsonのiレコード目のstart_dayを日付型で取得する
    start_time = new Date(record.start_day+" "+(record.time==""? time2:record.time));
    //jsonのiレコード目のend_dayを日付型で取得する
    end_time = new Date(record.end_day+" "+(record.time==""? time2:record.time));
    //jsonのiレコード目に関して、現在日時がstartとendの間に含まれていれば表示する
    if(now_date >= start_time && now_date <= end_time && record.name=="apple"){
        console.log("このデータは表示する");
        console.log(record);
    }else{
        console.log("このデータは表示しない");
        console.log(record);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る