質問するログイン新規登録

Q&A

解決済

4回答

905閲覧

在線上の表示のエラー、石動駅までは快速、石動駅以降は普通が表示されるようにしたいです。

senbokukoumi

総合スコア1

0グッド

1クリップ

投稿2025/01/13 04:42

0

1

実現したいこと

trainbasicdataで重複する列車番号時刻のものを、上書きされずに表示したいです。
今ここに3423mが重複しております。
これはもともと、石動駅まで快速列車として、石動駅以降を普通列車として表示させるつもりだったところを石動駅以降のみ、しかも、普通列車が重複して表示されてしまいます。なぜでしょう。
以下は元ネタです。
http://r113.web.fc2.com/p/viewer/jrw-hokuriku-20150314/index.html

発生している問題・分からないこと

イメージ説明
以上の画像のように3423mが本来は金沢駅から石動駅までは快速と表示しなければならないところを、
石動駅まで表示されず、代わりに石動駅以降普通列車が2つ重複して表示されます。
なぜでしょうか。

該当のソースコード

javascript

1function getTimeTable() 2{ 3 var i=0; 4 for(i=0 ; i<trainBasicData.length ; i++) 5 { 6 var trainNum = trainBasicData[i][0]; //列車番号 7 var runningDay = trainBasicData[i][1]; //運転日 8 9 //配列のキー 10 arrayKey = trainNum + "_" + runningDay; 11 //配列のキーを保存しておく 12 timeTableArrayKey[i] = arrayKey; 13 14 timeTable[arrayKey] = new Array(); 15 timeTable[arrayKey]["列車番号"] = trainBasicData[i][0]; 16 timeTable[arrayKey]["運転日"] = trainBasicData[i][1]; 17 timeTable[arrayKey]["種別"] = trainBasicData[i][2]; 18 timeTable[arrayKey]["列車名"] = trainBasicData[i][3]; 19 timeTable[arrayKey]["列車名(号数)"] = trainBasicData[i][4]; 20 timeTable[arrayKey]["方向"] = trainBasicData[i][5]; 21 timeTable[arrayKey]["始発駅"] = trainBasicData[i][6]; 22 timeTable[arrayKey]["行先"] = trainBasicData[i][7]; 23 timeTable[arrayKey]["始発駅発車時刻"] = HHMMtoSecond(trainBasicData[i][8]); 24 timeTable[arrayKey]["終着駅発車時刻"] = HHMMtoSecond(trainBasicData[i][9]); 25 26 //alert(timeTable[arrayKey]["列車番号"]+"は"+timeTable[arrayKey]["始発駅発車時刻"]+" and "+timeTable[arrayKey]["終着駅発車時刻"]) 27 28 //列車ごとに発着時刻の揺らぎを乱数で決める 0〜25の範囲で5秒刻みで 29 var timeFluctuation = Math.floor( Math.random() * 5 ) * 5; 30 31 timeTable[arrayKey]["駅時刻"] = new Array(); 32 var j=0; 33 for(j=0 ; j<stationList.length ; j++) 34 { 35 timeTable[arrayKey]["駅時刻"][j] = new Array(); 36 37 38 //対象外の駅の場合はスキップ 39 if(trainTimeData[i][j][0] < 0 && trainTimeData[i][j][1] < 0) 40 { 41 //alert(trainTimeData[i][j][0]+" "+trainTimeData[i][j][1]+" はスキップ"); 42 continue; 43 } 44 45 //着時刻 46 var arrivalTime = trainTimeData[i][j][0]; 47 //発時刻 48 var departureTime = trainTimeData[i][j][1]; 49 50 //alert(arrivalTime+" a "+departureTime); 51 52 //着時刻と初時刻を秒換算する 53 if(arrivalTime >= 0) 54 arrivalTime = HHMMtoSecond(arrivalTime); 55 if(departureTime >= 0) 56 departureTime = HHMMtoSecond(departureTime); 57 58 //3時より前の場合は、前日扱いにする 59 if(0 <= arrivalTime && arrivalTime < dayChangeTime) 60 arrivalTime += 24 * 60 * 60; 61 if(0 <= departureTime && departureTime < dayChangeTime) 62 departureTime += 24 * 60 * 60; 63 64 //alert(arrayKey + " "+ stationList[j] + "駅 " + arrivalTime+" b "+departureTime); 65 66 //着と発が同じ場合 67 if(arrivalTime == departureTime) 68 { 69 //着時刻に0〜25秒の揺らぎをたす 70 timeTable[arrayKey]["駅時刻"][j]["着"] = arrivalTime + timeFluctuation; 71 //発時刻に30+0〜25秒の揺らぎをたす 72 timeTable[arrayKey]["駅時刻"][j]["発"] = departureTime + 30 + timeFluctuation; 73 74 } 75 //発と着が違う場合 76 else if(arrivalTime >= 0 && departureTime >= 0) 77 { 78 //着時刻に+30+0〜25秒の揺らぎをたす 79 timeTable[arrayKey]["駅時刻"][j]["着"] = arrivalTime + 30 + timeFluctuation; 80 //発時刻に0〜25秒の揺らぎをたす 81 timeTable[arrayKey]["駅時刻"][j]["発"] = departureTime + timeFluctuation; 82 } 83 //発のみの場合 84 else if(arrivalTime < 0 && departureTime >= 0) 85 { 86 //発時刻に0〜25秒の揺らぎをたす 87 timeTable[arrayKey]["駅時刻"][j]["発"] = departureTime + 30/2 + timeFluctuation; 88 89 //始発駅では30秒間停車とする 90 timeTable[arrayKey]["駅時刻"][j]["着"] = departureTime + 30/2 + timeFluctuation - turningSecond; 91 } 92 //着のみの場合 93 else if(arrivalTime >= 0 && departureTime < 0) 94 { 95 //着時刻に+30+0〜25秒の揺らぎをたす 96 timeTable[arrayKey]["駅時刻"][j]["着"] = arrivalTime + 30/2 + timeFluctuation; 97 98 //終着駅では30秒間停車とする 99 timeTable[arrayKey]["駅時刻"][j]["発"] = arrivalTime + 30/2 + timeFluctuation + turningSecond; 100 } 101 102 103 104 105 106 //のりば 107 108 timeTable[arrayKey]["駅時刻"][j]["のりば"] = trainTimeData[i][j][2]; 109 110 //if(arrayKey == "2035G_全日") 111 112 113 //alert(arrayKey+"列車 "+stationList[j]+"駅は "+timeTable[arrayKey]["駅時刻"][j]["着"]+" / "+timeTable[arrayKey]["駅時刻"][j]["発"] +" "+timeTable[arrayKey]["駅時刻"][j]["のりば"]+"番のりば"); 114 115 } 116 117 118 ////////通過駅の各駅の通過時刻を推定する 119 //下りの場合は米原から姫路へ 120 //上りの場合は姫路から米原へ 121 //初期値 122 if(timeTable[arrayKey]["方向"] == "下り") 123 j = 0; 124 else 125 j = stationList.length - 1; 126 127 //通過区間の出発の駅 128 var passingStartStationNum = 0; 129 //通過区間の到着の駅 130 var passingEndStationNum = 0; 131 132 var passingFlag = false; 133 while(true) 134 { 135 //alert(trainTimeData[0]); 136 137 //今見ている駅 138 var nowStationNum = j; 139 //alert(nowStationNum); 140 141 //次に進む駅 142 if(timeTable[arrayKey]["方向"] == "下り") 143 nextStationNum = j + 1; 144 else 145 nextStationNum = j - 1; 146 147 //alert(stationList[nowStationNum]+"駅は"+trainTimeData[i][nowStationNum][0]+"/"+trainTimeData[i][nowStationNum][1]+"、"+stationList[nextStationNum]+"駅は"+trainTimeData[i][nextStationNum][0]+"/"+trainTimeData[i][nextStationNum][1]); 148 149 //停車駅→通過駅の場合 150 if(trainTimeData[i][nowStationNum][1] != -2 && trainTimeData[i][nextStationNum][0] == -2) 151 { 152 passingStartStationNum = nowStationNum; 153 passingFlag = true; 154 } 155 //通過駅→停車駅の場合 156 else if(passingFlag && trainTimeData[i][nowStationNum][1] == -2 && trainTimeData[i][nextStationNum][0] != -2) 157 { 158 //通過の東側の駅 159 passingEndStationNum = nextStationNum; 160 161 162 ////////通過区間の駅時刻を推定する 163 164 //通過区間の距離の和を計算する 165 var passingDistance = getDistance(passingStartStationNum, passingEndStationNum); 166 167 //通過区間を通過するのにかかる時刻 168 var passingTimeSum = timeTable[arrayKey]["駅時刻"][passingEndStationNum]["着"] - timeTable[arrayKey]["駅時刻"][passingStartStationNum]["発"]; 169 170 //alert(stationList[passingStartStationNum] + "~" + stationList[passingEndStationNum] + "は通過" + passingDistance + "km " + passingTimeSum + "秒") 171 172 //通過区間の駅の通過時刻を推定する 173 //ループの初期値 174 if(timeTable[arrayKey]["方向"] == "下り") 175 k = passingStartStationNum + 1; 176 else 177 k = passingStartStationNum - 1; 178 179 while( true ) 180 { 181 //手前の停車駅からその駅までの距離 182 var d = getDistance(passingStartStationNum, k); 183 184 //通過区間の距離の割合 185 var ratio = d / passingDistance; 186 //alert(d+" / "+ passingDistance + " = " + ratio); 187 188 var passingTime = timeTable[arrayKey]["駅時刻"][passingStartStationNum]["発"] + Math.floor(passingTimeSum * ratio); 189 190 //alert(stationList[k]+"駅は"+secondToHHMMSS(passingTime)+"頃通過"); 191 192 timeTable[arrayKey]["駅時刻"][k]["着"] = passingTime; 193 timeTable[arrayKey]["駅時刻"][k]["発"] = passingTime; 194 195 //ループを繰り返すたびに実行する処理 196 if(timeTable[arrayKey]["方向"] == "下り") 197 k++; 198 else 199 k--; 200 201 //ループを繰り返すかどうかの判定 202 if(timeTable[arrayKey]["方向"] == "下り" && k > passingEndStationNum - 1) 203 break; 204 else if(timeTable[arrayKey]["方向"] == "上り" && k < passingEndStationNum + 1) 205 break; 206 207 } 208 209 210 } 211 212 //ループを繰り返すたびに実行する処理 213 if(timeTable[arrayKey]["方向"] == "下り") 214 j++; 215 else 216 j--; 217 218 //ループを抜ける条件 219 if(timeTable[arrayKey]["方向"] == "下り" && j > stationList.length - 1 - 1) 220 break; 221 else if(timeTable[arrayKey]["方向"] == "上り" && j < 0 + 1) 222 break; 223 } 224 225 } 226 227 //3時になるまでは前日として扱うように 228 //midnightSpecialTime(); 229 230}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

function getTimeTable() {省略
while (true) {
var d = getDistance(passingStartStationNum, k);
var ratio = d / passingDistance;
var passingTime = timeTable[arrayKey]["駅時刻"][passingStartStationNum]["発"] + Math.floor(passingTimeSum * ratio);

timeTable[arrayKey]["駅時刻"][k]["着"] = passingTime; timeTable[arrayKey]["駅時刻"][k]["発"] = passingTime; if (timeTable[arrayKey]["方向"] == "下り") k++; else k--; if ((timeTable[arrayKey]["方向"] == "下り" && k > passingEndStationNum - 1) || (timeTable[arrayKey]["方向"] == "上り" && k < passingEndStationNum + 1)) { break; } } } if (timeTable[arrayKey]["方向"] == "下り") j++; else j--; if ((timeTable[arrayKey]["方向"] == "下り" && j > stationList.length - 1 - 1) || (timeTable[arrayKey]["方向"] == "上り" && j < 0 + 1)) { break; } } } // 3時になるまでは前日として扱うように // midnightSpecialTime();

}

補足

以上のようにすると、
石動駅までは快速列車が、石動駅以降は普通列車が表示されましたが、
石動駅では快速と普通が変わりばんこもしくはアットランダムで入れ替わるという不測の事態が発生してしまいました。
改善策をご提示願えませんか。

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

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

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

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

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

maisumakun

2025/01/13 08:08

trainBasicDataの内容はどのようになっていますか?
senbokukoumi

2025/01/13 08:20 編集

以下のようになっております。 ただやはり、字数制限にひっかることや、質問している立場のものがあまり長い文章を書くことは、 大変読みづらく、回答者される立場の方に対してに対して、回答する意欲を失してしまうため、 勝手ながら、trainbasicdata3までで以降は割愛させていただきます。 var trainBasicData = new Array(); var trainTimeData = new Array(); trainBasicData[0] = ["3423M", "全日", "快速", "", "", "下り", "金沢", "富山", 535, 554]; trainTimeData[0] = [ [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, 535, 7], [-2, -2, -2], [-2, -2, -2], [543, 543, -1], [-2, -2, -2], [554, 554, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1] ]; trainBasicData[1] = ["3423M", "全日", "普通", "", "", "下り", "金沢", "富山", 554, 627]; trainTimeData[1] = [ [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [554, 554, -1], [559, 559, -1], [603, 603, -1], [608, 608, -1], [612, 612, -1], [616, 616, -1], [622, 622, -1], [627, 627, 6], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1] ]; trainBasicData[2] = ["1001M", "全日", "特急", "はくたか", "1", "下り", "金沢", "越後湯沢", , ]; trainTimeData[2] = [ [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, 605, 7], [-2, -2, -2], [-2, -2, -2], [-2, -2, -2], [-2, -2, -2], [-2, -2, -2], [-2, -2, -2], [-2, -2, -2], [627, 628, -1], [-2, -2, -2], [-2, -2, -2], [-2, -2, -2], [638, 638, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1] ]; trainBasicData[3] = ["425M", "全日", "普通", "", "", "下り", "金沢", "富山", , ]; trainTimeData[3] = [ [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, 619, 7], [623, 623, -1], [627, 627, -1], [632, 633, -1], [638, 638, -1], [644, 644, -1], [651, 651, -1], [654, 654, -1], [659, 700, -1], [704, 704, -1], [708, 708, -2], [714, 714, -2], [719, 719, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1], [-1, -1, -1] ];
guest

回答4

0

arrayKey = trainNum + "_" + runningDay;となっている以上、毎日運転で列車番号も同じ2列車は、同じキーを共有する形となってしまいます。

timeTableは、あとから書いたほうで上書きされるので、両者が存在する石動駅で普通と快速の両者を出すことはできません。

arrayKeyを、両者を区別できるように振る必要があります。

投稿2025/01/13 08:19

maisumakun

総合スコア146745

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

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

0

以下のように、着時刻は1秒も揺らぎを与えないようにすると、
trainbasicdataで重複する列車番号時刻のものを、上書きされる問題が解決されました。
以上をもって、この度勝手ながら終了とさせていただきます。

function getTimeTable() { var i = 0; for (i = 0; i < trainBasicData.length; i++) { var trainNum = trainBasicData[i][0]; // 列車番号 var runningDay = trainBasicData[i][1]; // 運転日 var trainType = trainBasicData[i][2]; // 列車種別 // 配列のキー var arrayKey = trainNum + "_" + runningDay + "_" + trainType; // 配列のキーを保存しておく timeTableArrayKey[i] = arrayKey; timeTable[arrayKey] = new Array(); timeTable[arrayKey]["列車番号"] = trainBasicData[i][0]; timeTable[arrayKey]["運転日"] = trainBasicData[i][1]; timeTable[arrayKey]["種別"] = trainBasicData[i][2]; timeTable[arrayKey]["列車名"] = trainBasicData[i][3]; timeTable[arrayKey]["列車名(号数)"] = trainBasicData[i][4]; timeTable[arrayKey]["方向"] = trainBasicData[i][5]; timeTable[arrayKey]["始発駅"] = trainBasicData[i][6]; timeTable[arrayKey]["行先"] = trainBasicData[i][7]; timeTable[arrayKey]["始発駅発車時刻"] = HHMMtoSecond(trainBasicData[i][8]); timeTable[arrayKey]["終着駅発車時刻"] = HHMMtoSecond(trainBasicData[i][9]); // 列車ごとに発着時刻の揺らぎを乱数で決める 0〜25の範囲で5秒刻みで var timeFluctuation = Math.floor(Math.random() * 5) * 5; timeTable[arrayKey]["駅時刻"] = new Array(); var j = 0; for (j = 0; j < stationList.length; j++) { timeTable[arrayKey]["駅時刻"][j] = new Array(); // 対象外の駅の場合はスキップ if (trainTimeData[i][j][0] < 0 && trainTimeData[i][j][1] < 0) { continue; } // 着時刻 var arrivalTime = trainTimeData[i][j][0]; // 発時刻 var departureTime = trainTimeData[i][j][1]; // 着時刻と発時刻を秒換算する if (arrivalTime >= 0) arrivalTime = HHMMtoSecond(arrivalTime); if (departureTime >= 0) departureTime = HHMMtoSecond(departureTime); // 3時より前の場合は、前日扱いにする if (0 <= arrivalTime && arrivalTime < dayChangeTime) arrivalTime += 24 * 60 * 60; if (0 <= departureTime && departureTime < dayChangeTime) departureTime += 24 * 60 * 60; // 着と発が同じ場合 if (arrivalTime === departureTime) { timeTable[arrayKey]["駅時刻"][j]["着"] = arrivalTime; timeTable[arrayKey]["駅時刻"][j]["発"] = departureTime + 30; // ここでは乱数を加えない } // 発と着が違う場合 else if (arrivalTime >= 0 && departureTime >= 0) { timeTable[arrayKey]["駅時刻"][j]["着"] = arrivalTime + 30; // ここでも乱数を加えない timeTable[arrayKey]["駅時刻"][j]["発"] = departureTime; // 時刻が重なっている場合、乱数を加える if (timeTable[arrayKey]["駅時刻"][j]["着"] === timeTable[arrayKey]["駅時刻"][j]["発"]) { timeTable[arrayKey]["駅時刻"][j]["発"] += Math.floor(Math.random() * 5) * 5; // +方向に乱数を加える } } // 発のみの場合 else if (arrivalTime < 0 && departureTime >= 0) { timeTable[arrayKey]["駅時刻"][j]["発"] = departureTime + 30 / 2; // ここでも乱数を加えない timeTable[arrayKey]["駅時刻"][j]["着"] = departureTime + 30 / 2 - turningSecond; } // 着のみの場合 else if (arrivalTime >= 0 && departureTime < 0) { timeTable[arrayKey]["駅時刻"][j]["着"] = arrivalTime + 30 / 2; // ここでも乱数を加えない timeTable[arrayKey]["駅時刻"][j]["発"] = arrivalTime + 30 / 2 + turningSecond; } // 発時刻が未設定の場合、着時刻に30秒と揺らぎを加えた値を設定 if (timeTable[arrayKey]["駅時刻"][j]["発"] === undefined && timeTable[arrayKey]["駅時刻"][j]["着"] !== undefined) { timeTable[arrayKey]["駅時刻"][j]["発"] = timeTable[arrayKey]["駅時刻"][j]["着"] - 30; // マイナス方向 } // のりば timeTable[arrayKey]["駅時刻"][j]["のりば"] = trainTimeData[i][j][2]; } // 通過駅の各駅の通過時刻を推定する if (timeTable[arrayKey]["方向"] == "下り") { j = 0; } else { j = stationList.length - 1; } var passingStartStationNum = 0; var passingEndStationNum = 0; var passingFlag = false; while (true) { var nowStationNum = j; var nextStationNum = (timeTable[arrayKey]["方向"] == "下り") ? j + 1 : j - 1; // 停車駅→通過駅の場合 if (trainTimeData[i][nowStationNum][1] != -2 && trainTimeData[i][nextStationNum][0] == -2) { passingStartStationNum = nowStationNum; passingFlag = true; } // 通過駅→停車駅の場合 else if (passingFlag && trainTimeData[i][nowStationNum][1] == -2 && trainTimeData[i][nextStationNum][0] != -2) { passingEndStationNum = nextStationNum; var passingDistance = getDistance(passingStartStationNum, passingEndStationNum); var passingTimeSum = timeTable[arrayKey]["駅時刻"][passingEndStationNum]["着"] - timeTable[arrayKey]["駅時刻"][passingStartStationNum]["発"]; var k = (timeTable[arrayKey]["方向"] == "下り") ? passingStartStationNum + 1 : passingStartStationNum - 1; while (true) { var d = getDistance(passingStartStationNum, k); var ratio = d / passingDistance; var passingTime = timeTable[arrayKey]["駅時刻"][passingStartStationNum]["発"] + Math.floor(passingTimeSum * ratio); timeTable[arrayKey]["駅時刻"][k]["着"] = passingTime; timeTable[arrayKey]["駅時刻"][k]["発"] = passingTime; if (timeTable[arrayKey]["方向"] == "下り") k++; else k--; if ((timeTable[arrayKey]["方向"] == "下り" && k > passingEndStationNum - 1) || (timeTable[arrayKey]["方向"] == "上り" && k < passingEndStationNum + 1)) { break; } } } if (timeTable[arrayKey]["方向"] == "下り") j++; else j--; if ((timeTable[arrayKey]["方向"] == "下り" && j > stationList.length - 1 - 1) || (timeTable[arrayKey]["方向"] == "上り" && j < 0 + 1)) { break; } } } // 3時になるまでは前日として扱うように // midnightSpecialTime(); } // 使用例 // 使用例 function hideOverlappingTimes(trainTimeData) { for (let i = 0; i < trainTimeData.length; i++) { let currentRow = trainTimeData[i]; let isOverlapping = false; // 現在の行の発時刻または着時刻が重複しているか確認 for (let j = 0; j < trainTimeData.length; j++) { if (i !== j) { let compareRow = trainTimeData[j]; // 発着時刻の重なりを検出 if (currentRow[1] >= compareRow[0] && currentRow[0] <= compareRow[1]) { isOverlapping = true; break; } } } if (isOverlapping) { // 左側に [-1, -1, -1] があるか確認 if (i > 0 && trainTimeData[i - 1][0] === -1 && trainTimeData[i - 1][1] === -1 && trainTimeData[i - 1][2] === -1) { // 現在の行より後の行を非表示 for (let k = i + 1; k < trainTimeData.length; k++) { trainTimeData[k] = null; // または適切な非表示処理 } } // 右側に [-1, -1, -1] があるか確認 else if (i < trainTimeData.length - 1 && trainTimeData[i + 1][0] === -1 && trainTimeData[i + 1][1] === -1 && trainTimeData[i + 1][2] === -1) { // 現在の行を含むそれ以降の行を非表示 for (let k = i; k < trainTimeData.length; k++) { trainTimeData[k] = null; // または適切な非表示処理 } } } } }

投稿2025/02/13 23:34

senbokukoumi

総合スコア1

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

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

0

自己解決

function getStationTimetable(currentStaNum)
{
//alert(currentStaNum);

stationTimetableArrayKey = new Array(); stationTimetableArrayKey[currentStaNum] = new Array(); stationTimetableArrayKey[currentStaNum]["下り"] = new Array(); stationTimetableArrayKey[currentStaNum]["上り"] = new Array(); var i=0; var trainCount = new Array; trainCount["下り"] = 0; trainCount["上り"] = 0; for(i=0 ; i<trainBasicData.length ; i++) { arrayKey = timeTableArrayKey[i]; //運転日が一致する場合のみ続ける //if(timeTable[arrayKey]["運転日"] != "平日" && timeTable[arrayKey]["運転日"] != "全日") if(!judgeTrainRunningDay(timeTable[arrayKey]["運転日"])) continue; //駅の時刻がちゃんと入力されていて //、かつ終着駅=大阪駅でない場合 && timeTable[arrayKey]["行先"] != stationList[currentStaNum] if(timeTable[arrayKey]["駅時刻"][currentStaNum]["着"] >= 0 ) { var direction = timeTable[arrayKey]["方向"]; //列車番号+運転日を記録 stationTimetableArrayKey[currentStaNum][direction][trainCount[direction]] = arrayKey; //カウント trainCount[direction]++; //alert(arrayKey + " は " + stationList[currentStaNum] + "駅で " + timeTable[arrayKey]["駅時刻"][stationList[currentStaNum]]["着"] + "〜" + timeTable[arrayKey]["駅時刻"][stationList[currentStaNum]]["発"]); //stationTimetableArrayKey[19][trainCount] //trainCount++; } } //alert(stationList[currentStaNum]) //alert(stationTimetableArrayKey[currentStaNum]["下り"].length +"本を入れ替えよう"); ////////発車時刻の順にクイックソートで並び替える var i, j, k; for(i = 0 ; i<directionNameAry.length ; i++) { var currentDirection = directionNameAry[i]; var buff = ""; //データを一時的に避難させておくところ for(j=stationTimetableArrayKey[currentStaNum][currentDirection].length-1 ; j>=0 ; j--) { for(k=0 ; k<j ; k++) { //時刻の大小関係が逆だったら、入れ替える //クイックソート //入れ替える対象は var arrayKeyA = stationTimetableArrayKey[currentStaNum][currentDirection][k]; var arrayKeyB = stationTimetableArrayKey[currentStaNum][currentDirection][k+1]; //alert(arrayKeyA); //alert(arrayKeyB); if(timeTable[arrayKeyA]["駅時刻"][currentStaNum]["発"] > timeTable[arrayKeyB]["駅時刻"][currentStaNum]["発"]) { //入れ替える stationTimetableArrayKey[currentStaNum][currentDirection][k] = arrayKeyB; stationTimetableArrayKey[currentStaNum][currentDirection][k+1] = arrayKeyA; } } } } //alert(stationTimetableArrayKey[currentStaNum]["下り"]); //alert(stationTimetableArrayKey[currentStaNum]["下り"].length +"本あるよ"); //////結果をDIVに出力 for(i = 0 ; i<directionNameAry.length ; i++) { var currentDirection = directionNameAry[i]; var output = ""; output += ""; output += ""; //output += "<table border='0'>"; output += "<div>"; output += ""; output += ""; output += ""; nextTrainHeight = ""; //次発の列車の縦位置を記録する変数 divTop = 0; //1行ごとに20ずつ増やしていく for(j=0 ; j < stationTimetableArrayKey[currentStaNum][currentDirection].length ; j++) { var currentArrayKey = stationTimetableArrayKey[currentStaNum][currentDirection][j]; //alert(currentArrayKey); //document.getElementById("staTimetableTimeDiv").innerHTML += i+"本目 "+currentArrayKey+"<br />"; //output += "<tr style='white-space:nowrap; height:25px; '>"; var bgColor = getTypeColor(timeTable[currentArrayKey]["種別"], 0); var color = getTypeColor(timeTable[currentArrayKey]["種別"], 1); output += "<div style='position:absolute; top:"+divTop+"px; left:0px; width:60px; text-align:center;'><span style='color:"+color+"; background-color:"+bgColor+"'>" + timeTable[currentArrayKey]["列車番号"] + "</span></div>"; output += "<div style='position:absolute; top:"+divTop+"px; left:40px; width:120px; text-align:center;'><span style='color:"+color+"; background-color:"+bgColor+"'>" + timeTable[currentArrayKey]["種別"] + "</span></div>"; //着時刻と発時刻が異なる場合、つまりその駅に停車する場合 if(timeTable[currentArrayKey]["駅時刻"][currentStaNum]["着"] != timeTable[currentArrayKey]["駅時刻"][currentStaNum]["発"]) { //着時刻 var timeOutput = ""; var secondSum = timeTable[currentArrayKey]["駅時刻"][currentStaNum]["着"]; timeOutput += digitAdjuster(secondToHour(secondSum), "&nbsp;"); timeOutput += ":"; timeOutput += digitAdjuster(secondToMinute(secondSum), "0"); //timeOutput += "<span style='font-size:70%;'> "; //timeOutput += digitAdjuster(secondToSecond(secondSum), "0"); //timeOutput += "</span>"; timeOutput += ""; output += "<div style='position:absolute; top:"+divTop+"px; left:150px; width:70px; text-align:right;'>" + timeOutput + " <span style='font-size:80%; '>着</span></div>"; //発時刻 var timeOutput = ""; var secondSum = timeTable[currentArrayKey]["駅時刻"][currentStaNum]["発"]; timeOutput += digitAdjuster(secondToHour(secondSum), "&nbsp;"); timeOutput += ":"; timeOutput += digitAdjuster(secondToMinute(secondSum), "0"); //timeOutput += "<span style='font-size:70%;'> "; //timeOutput += digitAdjuster(secondToSecond(secondSum), "0"); //timeOutput += "</span>"; timeOutput += ""; output += "<div style='position:absolute; top:"+divTop+"px; left:230px; width:70px; text-align:right;'>" + timeOutput + " <span style='font-size:80%; '>発 </span></div>"; } else { //その駅を通過する列車の場合 var timeOutput = ""; var secondSum = timeTable[currentArrayKey]["駅時刻"][currentStaNum]["発"]; timeOutput += digitAdjuster(secondToHour(secondSum), "&nbsp;"); timeOutput += ":"; timeOutput += digitAdjuster(secondToMinute(secondSum), "0"); //timeOutput += "<span style='font-size:70%;'> "; //timeOutput += digitAdjuster(secondToSecond(secondSum), "0"); //timeOutput += "</span>"; timeOutput += ""; //output += "<td colspan='2' style='text-align:center;'>" + timeOutput + " 通過</td>"; output += "<div style='position:absolute; top:"+divTop+"px; left:230px; width:70px; text-align:center; color:#aaa; '>" + timeOutput + " <span style='font-size:80%; '>通過</span></div>"; } //次発の列車の縦位置を特定する var secondSum = timeTable[currentArrayKey]["駅時刻"][currentStaNum]["発"]; if(setSecondSum < secondSum && nextTrainHeight == "") nextTrainHeight = divTop - 20; if(timeTable[currentArrayKey]["行先"] != stationList[currentStaNum]) { output += "<div style='position:absolute; top:"+divTop+"px; left:310px; width:150px; '>" + timeTable[currentArrayKey]["行先"] + "<span style='font-size:80%;'> 行</span></div>"; } else { output += "<div style='position:absolute; top:"+divTop+"px; left:310px; width:80px; '>当駅止まり</div>"; } if(timeTable[currentArrayKey]["駅時刻"][currentStaNum]["のりば"] >= 0) output += "<div style='position:absolute; top:"+divTop+"px; left:390px; width:80px; text-align:right;'>" + timeTable[currentArrayKey]["駅時刻"][currentStaNum]["のりば"] + "<span style='font-size:80%;'> 番線</span></div>"; else output += "<td></td>"; output += "</tr>\n"; divTop+= 20; } //output += "</table>"; output += "</div>"; var idName = "staTimetableTime"+i+"Div"; if(document.getElementById(idName) != null) document.getElementById(idName).innerHTML = output; //現在時刻へスクロールする if(document.getElementById(idName) != null) document.getElementById(idName).scrollTop = nextTrainHeight; var idName = "staTimetableTimeTitle"+i+"Div"; if(document.getElementById(idName) != null) document.getElementById(idName).innerHTML = stationList[currentStaNum]+"駅 "+currentDirection+" 時刻表"; output += ""; output += ""; output += ""; }

}→始発駅と終着駅の表示時間に揺らぎを持たせないことで解決しました。

投稿2025/01/13 23:23

編集2025/02/14 03:47
senbokukoumi

総合スコア1

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

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

0

これ以上やってもらちがあきません。諦めます。

投稿2025/01/13 09:47

senbokukoumi

総合スコア1

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

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

maisumakun

2025/01/13 11:51

さすがにクローズが早すぎませんか? (いま気づきましたが、クローズしたあとに書き込む気にはならないです)
senbokukoumi

2025/01/13 11:58

すみません。 ただ、どうしてもご回答を勝手ながら早くいただきたかったので。 せかすわりに悪いのですが、さすがに夜遅いため、 只今回答を頂戴いただいても勝手ながら、返事は明日の7時以降となります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問