sembokulove
@sembokulove (Missing place)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

電車の運賃検索がうまく動作しないのはなぜでしょうか。

解決したいこと

ここに解決したい内容を記載してください。

例)
電車の運賃プログラムを作成しております。
直書きだとうまく運賃データを表示できたのに、外部にするとエラーになりました。
具体的には、山陽本線の駅間に与えられた引数(sanyo_nomaltraffic)を幹線の運賃に(maintraffic)に渡し切れていないものだと思われます。

発生している問題・エラー

ないのになぜかエラー。

例)

NameError (uninitialized constant World)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

javascript

例)

def greet
  puts Hello World
end

チャットgptを使って、関数化するなどいろいろ手を尽くしました。もう手詰まりです。
以下は大本のプログラムです。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
</head>

<body>
  <div>
    出発駅:
    <select name="from" id="stations1">
      <option>駅を選択してください。</option>
      <option value="西明石">西明石</option>
      <option value="加古川">加古川</option>
      <option value="姫路">姫路</option>
      <optgroup label="播但線"></optgroup>
      <option value="京口">京口</option>
      <option value="野里">野里</option>
      <option value="A">A</option>
      <option value="B">B</option>
      <option value="C">C</option>
      <option value="D">D</option>
    </select>
  </div>
  <div>
    到着駅:
    <select name="to" id="stations2">
      <option>駅を選択してください。</option>
      <option value="西明石">西明石</option>
      <option value="加古川">加古川</option>
      <option value="姫路">姫路</option>
      <optgroup label="播但線"></optgroup>
      <option value="京口">京口</option>
      <option value="野里">野里</option>
      <option value="A">A</option>
      <option value="B">B</option>
      <option value="C">C</option>
      <option value="D">D</option>
    </select>
  </div>
  </div>
  距離:<span name="distance"></span>km<br />
  普通運賃:<span name="adult"></span>円<br />
  小児運賃:<span name="child"></span>円<br />
<script src="js♪20240326♪Tue/faresystem♪20240326♪Tue.js"></script>
<script src="js♪20240326♪Tue/jrwest♪maintraffic101♪20240327♪Wed.js"></script>
<script src="js♪20240326♪Tue/jrwest♪localtraffic101♪20240327♪Wed.js"></script>
<script src="js♪20240326♪Tue/sanyo♪nomal101♪20240327♪Wed.js"></script>
<script src="js♪20240326♪Tue/bantan101♪20240327♪Wed.js"></script>
</body>

</html>
乗車区間:
<span id="span1"></span>
~
<span id="span2"></span>
間

<script>
document.getElementById("stations1").addEventListener("change", function() {
  // value値を取得
  const str1 = this.value;
  document.getElementById("span1").textContent = str1;
});
document.getElementById("stations2").addEventListener("change", function() {
  // value値を取得
  const str1 = this.value;
  document.getElementById("span2").textContent = str1;
});
</script>

上手くいったのは、

function calc() {
  var f = document.querySelector('[name=from]').value;
  var t = document.querySelector('[name=to]').value;

  // 駅間に一致するものを探す
  var eki_info = null;
  for (var i = 0; i < list.length; i++) {
    var eki1 = list[i].name[0];
    var eki2 = list[i].name[1];
    if ((eki1 == f && eki2 == t) || (eki1 == t && eki2 == f)) {
      eki_info = list[i];
      break;
    }
  }

  // 運賃情報を取得
  var far_info = null;
  if (eki_info) {
    far_info = customCalc(eki_info.section[0]);
  }

  // 情報を設定
  if (eki_info && far_info) {
    document.querySelector('span[name=distance]').innerHTML = eki_info.distance;
    // document.querySelector('span[name=section]').innerHTML = far_info.section + '区間';
    document.querySelector('span[name=adult]').innerHTML = far_info.adult;
    document.querySelector('span[name=child]').innerHTML = far_info.child;
  }
}

document.addEventListener('DOMContentLoaded', function () {
  document.querySelector('select[name=from]').addEventListener('change', calc);
  document.querySelector('select[name=to]').addEventListener('change', calc);
});

function customCalc(section) {
  var customFarInfo = null;

  // 新しい条件に基づいて運賃情報を探す
  if (section.includes("sanyo_nomal")) {
    section = section.replace("sanyo_nomal", "jrwest_maintraffic");
  }
  else if (section.includes("bantan")) {
    section = section.replace("bantan", "jrwest_localtraffic");
  }

  // 該当する運賃情報を取得
  for (var i = 0; i < fares.length; i++) {
    if (fares[i].section.includes(section)) {
      customFarInfo = fares[i];
      break;
    }
  }

  return customFarInfo;
}

これが、播但線を含む地方交通線の運賃表で、

function createFaresArray() {
  return [
      { section: "jrwest_localtraffic_1", adult: 150, child:80,
        commute_company_1: 4620, commute_company_3: 13170, commute_company_6: 22160,
        commute_university_1: 2760, commute_university_3: 7830, commute_university_6: 14860,
        commute_highschool_1: 1380, commute_highschool_3: 3920, commute_highschool_6: 7430  ];
}

// 関数を呼び出して fares 配列を取得する例:
var fares = createFaresArray();

これが、播但線の駅間に対し、数値を与え、上記の地方交通線の運賃表へ院数を渡すプログラムです。

    var list = (list ?? []).concat([
      { name: ["姫路", "京口"], distance: 1.7, section: ["bantan_2"] },
    ]);
// 既存のリストを渡して、新しいアイテムを追加したリストを取得する例:
var list = []; // 既存のリスト
list = addToItemList(list);

これで、以下の3ファイルで播但線の運賃を参照することはできております。
ところが、山陽本線にあたる、本線の運賃表のプログラムが、

function createFaresArray() {
  return [
      { section: "jrwest_maintraffic_1", adult: 150, child:80,
        commute_company_1: 4620, commute_company_3: 13170, commute_company_6: 22160,
        commute_university_1: 2760, commute_university_3: 7830, commute_university_6: 14860,
        commute_highschool_1: 1380, commute_highschool_3: 3920, commute_highschool_6: 7430];
}

// 関数を呼び出して fares 配列を取得する例:
var fares = createFaresArray();
上手く動作しないのです。
以下は、山陽本線の駅間に与えられた数値から、幹線の運賃表へ院数を渡すプログラムです。
var list = (list ?? []).concat([
  { name: ["西明石", "姫路"], distance: 32, section: ["sanyo_nomal_32"] },
  { name: ["加古川", "姫路"], distance: 15.7, section: ["sanyo_nomal_16"]);

// 既存のリストを渡して、新しいアイテムを追加したリストを取得する例:
var list = []; // 既存のリスト
list = addToItemList(list);





0

1Answer

FILE_NOT_FOUNDとあるので該当するファイルへのファイルパスが正しくないということになります.コンソールを見直してどのファイルが読めてないのか確認してください.
パス中の意図しない箇所の文字が全角文字とかに置き換わってることがあるので,パスに空白文字とか使うのは避けてください.

ついでにvar list = (list ?? []).concat(とか単純な変数名でグローバルスコープを占有するような書き方は諸々のスクリプトに影響を与えるので,モジュールを使うか関数化するかした方が良いです.

1Like

Comments

  1. @sembokulove

    Questioner

    ファイルのパスが正しいかどうかは、ソースを見て、scriptに書いてある、URLが開けるかどうかで判断できます。
    次に、モジュールを使うか関数化するかですが、これがよく理解しかねます。
    記述の仕方を私が書いたjsの文章に当てはめ全文省略せずに(但し、2つ目の配列以降は省略してもいい)ご掲示されることをご所望いたします。

  2. デバッグというのは実行環境での結果で行ってください.要するに最初はブラウザのコンソールだけを見ろということです.何がNOT FOUNDなのか書いてあるのですから確認することくらいはできます.
    モジュール化に関しては下手すると全文書き直すレベルでの修正が必要なので,拡張機能か何かで動かなくなっても気にしないというのなら忘れてください.モジュールが何者かは"ES module"とかで調べてください.
    そもそもソースを丸ごと貼り付けて直せと言われているようなもんですので,前にも言った通りそんな我儘に応えるような暇人はいないです.

  3. @sembokulove

    Questioner

    パスも見直し、空白文字を♪に変えました。
    エラーメッセージは出ませんが、プログラムは挙動しません。
    なぜでしょうか?

  4. @sembokulove

    Questioner

    原因がわかりました。
    多分、読み込み制限オーバーです。

  5. 解決したのでしたら、本問をクローズしましょう。

Your answer might help someone💌