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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JavaScript

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

929閲覧

JavaScriptでの文字列検索(indexOf)

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JavaScript

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/01/08 03:14

編集2020/01/08 03:34

制作背景

現在JavaScriptの表を用いてカレンダーを製作しています。
ひと月表示で、日にちの枠の中に日付だけでなく、祝日や六曜を入れようとしています。
そこで表示させたいデータはcsvで作成し、日付ごとにjsで呼び出したいです。

行き詰まった点

下記コードにおいて、カレンダー表示させる年月日を取得(sdate)し、
naikakudata内をindexOfで検索、一致したらその日の祝日名(naikakudata[baa][1])を返し、一致するものがないときは0を返します。

sdateは2020/1/1と取得できているのですが、(1)の部分が常に-1となってしまい、naikakudaraが取り出せていません。正しく照合させるためにはどうしたらよいでしょうか?
アドバイスお願いいたします。

JavaScript

1function shukujitu(syear, smonth, sday){ 2 3var sdate = syear + "/" + smonth + "/" + sday; 4var naikakudata = csvToArray("../../events/newshukujitu.csv"); 5let EndofSyukujitu = naikakudata.length 6 7 for(let i = 1; i < EndofSyukujitu; i++) { 8var baa = naikakudata.indexOf(sdate); 9 console.log(baa); //(1) 10 var syukujitu = naikakudata[i][0]; 11 if(baa != -1){ 12 return naikakudata[baa][1]; 13 }else { 14 return 0; 15 } 16 } 17}

使用データ

内閣府から配布されている祝日データのCSVファイルを使用しています。(一部抜粋)

CSV

12020/1/1,元日 22020/1/13,成人の日 32020/2/11,建国記念の日 42020/2/23,天皇誕生日 52020/2/24,休日 62020/3/20,春分の日 72020/4/29,昭和の日 82020/5/3,憲法記念日 92020/5/4,みどりの日 102020/5/5,こどもの日 112020/5/6,休日 122020/7/23,海の日 132020/7/24,スポーツの日 142020/8/10,山の日 152020/9/21,敬老の日 162020/9/22,秋分の日 172020/11/3,文化の日 182020/11/23,勤労感謝の日 19

補足

頂きました質問にできるだけ補足します。
不明点等は随時コメントください!

**csvToARRAY **
こちらは他のコードで使えています。また、consoleでnaikakudataに二次元配列のように取得できています。

JavaScript

1 function csvToArray(path) { 2 "use strict"; 3 var csvData =new Array(); 4 var data = new XMLHttpRequest(); 5 data.open("GET", path, false); 6 data.send(null); 7 var LF = String.fromCharCode(10); 8 var lines = data.responseText.split(LF); 9 for (var i = 0; i < lines.length; ++i) { 10 var cells = lines[i].split(","); 11 if (cells.length !== 1) { 12 csvData.push(cells); 13 } 14 } 15 return csvData; 16 }

引数のステートメント
yearとmonthはグローバル変数として宣言されています。こちらも、使用したい内容になっていることは確認済みです。
sdayに入るdayCountも取得できています。

JavaScript

1let year = parseInt(monthlyData[0], 10); 2let month = parseInt(monthlyData[1], 10); 3 4//////////////別の関数内にて 5 let dayCount = 1; // 日にちのカウント 6  var sss = shukujitu(year, month, dayCount);

取得している日付データがletで、検索対象が文字列(string?)という問題もあるのでしょうか…?

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

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

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

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

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

miyabi_takatsuk

2020/01/08 03:18

csvToArrayの中身も掲示していただかないとなんとも言えません。 また、function shukujitu(syear, smonth, sday)を実行しているステートメントの掲示もお願いします。 (引数に何を入れて実行しているのかを知りたい)
guest

回答2

0

ベストアンサー

naikakudataは配列の配列なのでそういう検索してもマッチしないはず。

syukujitu と sdate が等しいか判定すればよいのでは?

javascript

1function shukujitu(syear, smonth, sday){ 2 3 const sdate = `${syear}/${smonth}/${sday}`; 4 const res = csvToArray("../../events/newshukujitu.csv").filter(r=>r[0] === sdate)[0]; 5 return res ? res[1] : 0; 6}

投稿2020/01/08 03:30

編集2020/01/08 14:18
papinianus

総合スコア12705

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

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

papinianus

2020/01/08 03:32

naikakudataをmapで射影とれば、indexOfがききますが。あるいは目的からするとfilterが適切ですかね。
退会済みユーザー

退会済みユーザー

2020/01/08 05:23

配列の配列となるのですね…勉強になります。 シンプルにsyukujituとsdateの判定でできました。 mapとfilterについても調べてみます。 ご回答ありがとうございます!
guest

0

(1)の部分が常に-1となってしまい

二重配列全体に対してindexOf() を評価しているからです。

  1. 配列を走査するときは、別の変数に代入すると分かりやすいです。
for(/* omitted */) { console.log(naikakudata); let info = naikakudata[i]; // 1. console.log(info); /* omitted */ }

IE では使えませんが for...of という構文もあります。

投稿2020/01/08 05:08

AkitoshiManabe

総合スコア5432

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

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

退会済みユーザー

退会済みユーザー

2020/01/08 05:21

全体について捜査していたのですね… ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問