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

回答4件
あなたの回答
tips
プレビュー