for文を使い、二次元配列の値の正誤を取得したいのですが、上手く反映されないです。初心者なので、ネットで調べながらやっているのですがわかりません。どうか教えてください。

また、二次元配列にない値を入れると、"IDとパスワードが一致しません"とアラート表示されるのですが、三回連続で表示されてしまい困っています。解決策わかる方いらっしゃいましたらどうぞよろしくお願いいたします。

```

    function logincheck(){
      const id = document.getElementById('id').value;
      const pw = document.getElementById('pas').value;
    
      //ユーザー仮ナンバー
      const usernum=[
        ['ss', '2222'],
        ['df', '4444'],
        ['we', '5555'],
      ];
    
      //ID PW未入力時
      if(id === "" && pw === ""){
        alert("IDとパスワードは必須入力です");
      
      //ID未入力時
      }else if(id === ""){
        alert("IDは必須入力です");
      
      //PW未入力時
      }else if(pw === ""){
        alert("パスワードは必須入力です");
      }else{
        //ID PW一致チェック
        for(let i=0; i<usernum.length; i++){
          let item = usernum[i];
          if(item[0] === id && item[1] === pw){
            window.location.href='html トップ画面.html';
          }else{
            alert("IDとパスワードが一致しません");
          }
        }
      }
    }
    
```
CC BY-SA 4.0
2021-06-08T05:39:00.227
77406
2021-06-11T07:09:34.000
2021-06-08T07:56:00.917
3060
46738
question
javascript
for文で二次元配列の値の正誤確認のやり方
プログラムの書き方の問題というよりアルゴリズムの問題かと思います。  
タイトルには「配列の正誤確認のやり方」とありますが、  
実際は「配列の存在確認のやり方」になるかと思います。

現在書かれているIDPW一致プログラムは以下のようですが、

```

    //ID PW一致チェック
    for(let i=0; i<usernum.length; i++){
      let item = usernum[i];
      if(item[0] === id && item[1] === pw){
        window.location.href='html トップ画面.html';
      }else{
        alert("IDとパスワードが一致しません");
      }
    }
    
```

このプログラムを説明すると  
・配列に一致するものがあれば、リダイレクト  
・配列に一致しないものがあれば、アラート  
というアルゴリズムになっています。  
これは正誤チェックは正しく動いていますが、やりたいことは正誤チェックではなく  
配列に存在するかどうかのはずです。

本来やらなければいけないアルゴリズムは  
・配列に一致するものがあれば、リダイレクト  
・配列に **一つも一致するものがなければ、アラート**  
となるでしょう。  
このアルゴリズムであれば、配列に存在するかどうかチェックできます。

上記の条件を満たすためにはいくつか方法はありますが、  
シンプルに書けばfor文を回しつつ一致する場合分けifブロックに入らなかった場合はアラート出すがシンプルに実現できるかと思います。

```

    //ID PW一致チェック
    for(let i=0; i<usernum.length; i++){
      let item = usernum[i];
      if(item[0] === id && item[1] === pw){
        window.location.href='html トップ画面.html';
      }
    }
    alert("IDとパスワードが一致しません");    //ここにきている時点でlocation.hrefが実行されていないので配列には存在していなかったとみなせる
    
```

余談ですが、  
ログインPWをjavascriptのクライアント側で実装することはありません。なぜなら一般的に認証機構はサーバサイドでやるべきであり、また配列を回すのではなくMySQLなどのRDBを用いて実装することが多いと思います。  
練習用かと見受けれられますが、あまり一般的な実用的な問題ではないかもしれません。  
アルゴリズムとプログラミングの練習としては良いでしょうけど、このやり方が一般的ではないと理解しておいたほうがいいと思います。
CC BY-SA 4.0
2021-06-11T07:09:34.000
77479
2021-06-11T07:09:34.000
22665
77406
answer