Javascript:从数组中获取索引值

时间:2010-02-12 22:13:01

标签: javascript

这是我正在接受的Java脚本课程......

我需要创建一个简单的用户登录脚本。当页面加载时会弹出一个提示,询问用户名。如果输入了正确的用户名,则会显示另一个要求输入密码的提示。

如果用户名和有效,那么你是一个成功的消息,否则你会得到一条失败的消息。

我已经编写了所有代码,但在验证用户名和密码方面遇到了麻烦。 您可以在我的代码中看到我正在使用两个数组列表。一个用于用户,另一个用于密码。当我运行我的代码时,如果我输入user1的正确用户名和密码,它会验证,但如果我输入user1和user2的密码,它仍然会验证。

<script type="text/javascript">
//Input from user
    var userId = prompt("Enter UserID", "");
        userId_lowercase = userId.toLowerCase();


//Username and Password Arrays
    var userIdList = new Array();
        userIdList[0] = "user1";
        userIdList[1] = "user2";
        userIdList[2] = "user3";

    var passwordList = new Array();
        passwordList[0] = "pass1";
        passwordList[1] = "pass2";
        passwordList[2] = "pass3";

//Process input and check for authentication

    //Check for correct userId

        var userIdFound;

        for (index in userIdList) 
        {
            if (userId_lowercase == userIdList[index]) 
            {
                userIdFound = "Y";
                break;
            }
        }

        if (userIdFound == "Y") 
        {
            document.write("<p>" + userId + " was Found</p>"); ;
            //Check for correct Password
            var password = prompt("Enter Password", "");
            var passwordFound;

            for (index in passwordList) 
            {
                if (password == passwordList[index]) //  This is where I need help, 
                                                     //  how do I say 
                                                     //  "if password is from the passwordList && it matches the userId index selected"

                {
                    passwordFound = "Y";
                    break;
                }
            }

            if (passwordFound == "Y") 
            {
                document.write("<p>Welcome to the class!</p>"); 
            }
            else 
            {
                document.write("<p>Error: Password is not valid.</p>"); 
            }//END Password Check

        } 
        else 

        {
            document.write("<p>" + userId + " was NOT found</p>"); 
        }//END USERID Check

</script>

5 个答案:

答案 0 :(得分:2)

不使用数组,而是将对象用作关联数组:

var Users = {
    root: 'god',
    fred: 'derf',
    luser: 'password'
};

// you can access object properties using dot syntax:
User.root
// or using array syntax with a string as index
User['root'];
// when the name is stored in a variable, array syntax is the only option
var name='root';
User[name];

这是一件好事,这是家庭作业,否则由于固有的不安全感,我不得不用一揽子线条来打击你。

您还应该考虑使用DOM API而不是过时的document.write

<script type="text/javascript">
  ...
  function reportLogin(msg) {
    var loginMsg = document.getElementById('LoginMsg');
    if (loginMsg.firstChild) {
      loginMsg.firstChild.nodeValue=msg;
    } else {
      loginMsg.appendChild(document.createTextNode(msg))
    }
  }
</script>
...
<p id="LoginMsg"></p>

<script type="text/javascript">
  ...
  function reportLogin(msg) {
    document.getElementById('LoginMsg').firstChild.nodeValue=msg;
  }
</script>
...
<p id="LoginMsg"> </p>

(请注意#LoginMsg中的空格。)

答案 1 :(得分:2)

首先,我不会使用for-in,我会使用一个简单的for循环迭代数组。然后,您可以存储与用户名匹配的索引,以将其与密码数组进行比较:

var index;
var userIndex;
for (index = 0; index < userIdList.length; index++) {
            if (userId_lowercase == userIdList[index]) 
            {
                userIndex = index;
                userIdFound = "Y";
                break;
            }
}

然后,在您的密码循环中,您会说:

if (password == passwordList[index] && index == userIndex)
{
    passwordFound = "Y";
    break;
}

这是解决问题的简单方法。我不知道你学到了多少,但你也可以使用一系列对象:

var userLogins = [{user:"user1", password:"pass1"},...etc];

然后在询问名称和密码并查看它们是否匹配后循环遍历该数组:

for (index = 0; index < userLogins.length; index++) {
    if (userLogins.user == userId_lowercase && userLogins.password == password) {
        //Do stuff here
    }
}

要记住的是,您必须以某种方式将用户名链接到密码。您目前正在执行此操作的方式是通过两个阵列中的索引,但这不能保证。以某种方式链接两位信息会好得多,就像在上面的对象数组中一样。

答案 2 :(得分:1)

这是我将使用哈希表(关联数组)

的地方
var users = {
user1:"pass1",
user2:"pass2",
user3:"pass3"
}; 

现在你可以这样测试:

function checkValidUser(userId, userPwd) {
  return ( users[userId] == userPwd );
}

很简单。

答案 3 :(得分:0)

您需要根据密码检查用户名的索引。一旦你有用户名将该索引保存到变量say indexOfUserName并检查该密码数组的索引。所以代替if(password == passwordList [index])检查if(password == passwordList [indexOfUserName])

答案 4 :(得分:0)

如果你想让老师对她的问题感到遗憾,这里有一个特别的版本:

    var users = { user1:true, user2:true, user3:true },
        pwds = {user1:'pw1', user2:'pw2', user3:'pw3'};

    function theUser(userId){
        return {
            hasThePassword:function(pwd){
                return users[userId] && pwds[userId] === pwd;
            }
        };
    }
    if( theUser( prompt('Enter UserID', '') ).hasThePassword( prompt('Enter Password', '') )){
        alert('user ok');
    }else{
        alert('wrong user or password');
    };

- )