如何循环通过JSON数组直到满足条件?

时间:2016-06-02 21:59:47

标签: javascript

刚开始学习JavaScript并尝试找出迭代数组以模拟登录过程的正确方法。

function validateLogin() {
  var userdata = {
    "users": [{
      "username": "james",
      "password": "pass1"
    }, {
      "username": "russel",
      "password": "pass2"
    }, {
      "username": "jane",
      "password": "pass3"
    }, {
      "username": "jeff",
      "password": "pass4"
    }]
  };
  var uname = document.getElementById("username");
  var pword = document.getElementById("password");

  var user = userdata.users;

  for (var item in user) {
    if (user[item].username == uname && user[item].password == pword) {
      alert("Correct Username and Password")
    } else {
      alert("Incorrect Username or Password");
    }
  }
}

问题是它存储了所有数据" user [item] .username"当它意味着存储数组的一部分说[0]然后检查是否" uname"和" pword"是否相同,如果不进行,如果不是,验证细节不正确。

我确定打算做一些像count = user [item] .username;然后将++计算到下一次迭代?

无论哪种方式,我都没有得到它!任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

你的循环很好;我怀疑你的代码的真正问题,正如@squint所提到的,你是在将字符串与DOM元素进行比较,而不是与这些元素中包含的值(可能)进行比较。

但是,有几种方法可以改善你的循环。首先,你提到你不希望循环继续,如果它找到了它正在寻找的东西。您可以使用break statement

完成此操作
  for (var item in users) {
    if (users[item].username == uname && users[item].password == pword) {
      break;
    }
  }

当然,这只是让你走出循环,但没有记录有关你如何摆脱循环的任何信息。为此,您可以考虑初始化变量以保存user对象,并在循环外引用它(请注意,此处,我已将userdata.users保存在名为users的变量中,而不是{ {1}},因为这听起来更好,并允许我们使用user来存储我们正在寻找的实际个人用户:

user

另请注意,JavaScript for .. in statement在很多方面都不是迭代数组的理想方式。如果可以的话,最好使用全新的for .. of statement,以及使用全新的Array.find。如果不是 var users = userdata.users; var user; for (var item in users) { if (users[item].username == uname && users[item].password == pword) { user = users[item]; break; } } if (user) { console.log("Welcome " + user.username); } else { console.log("Invalid username or password"); } 循环:

for

最后,如果您想真正想要使用ES6(最新的稳定版JavaScript),您可以使用全新的boto3.Bucket.upload_file方法:

  var users = userdata.users;
  var user;

  for (var i = 0; i < users.length; i++) {
    if (users[i].username == uname && users[i].password == pword) {
      user = users[i];
      break;
    }
  }

  if (user) {
    console.log("Welcome " + user.username);
  } else {
    console.log("Invalid username or password");
  }

&#13;
&#13;
var user = userdata.users.find(function (user) {
  return user.username === uname && user.password === pword;
});
&#13;
function validateLogin() {
  var userdata = {
    "users": [
      {"username": "james", "password": "pass1"},
      {"username": "russel", "password": "pass2"},
      {"username": "jane", "password": "pass3"},
      {"username": "jeff", "password": "pass4"}
    ]
  };

  var uname = document.getElementById("username").value;
  var pword = document.getElementById("password").value;

  var users = userdata.users;
  var user;

  for (var i = 0; i < users.length; i++) {
    if (users[i].username == uname && users[i].password == pword) {
      user = users[i];
      break;
    }
  }

  if (user) {
    console.log("Welcome " + user.username);
  } else {
    console.log("Invalid username or password");
  }

  return false;
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

在javascript中搜索until循环示例时,嘿遇到了这个问题...那里没有运气但我在jsconsole上测试了你可能喜欢的while循环选项

TLDR /单行

var arr = ['first']; arr.push('second', 'third'); var i = 0; while (i < arr.length){ console.log(arr[i]); i++; };

Scriptlet版本

#!/usr/bin/env node
// Assign first word/line/character into array type variable
var arr = ['first'];
// Push further values into array setup above
arr.push('second', 'third');
// Assign index for array to start point
var i = 0;
// Start while loop and continue while index value is less then array total length
while (i < arr.length){
    // Present currently processed array indexed value
    console.log(arr[i]);
    // Place more processing lines here
    // Add one to index variable for array before allowing loop to exit or parse the next index
    i++;
};
// close while loop

在上面的任何一个中,输出应该是相同的...看起来已经有很多if检查的例子所以选择你想要投入到上面的周围的测试。

答案 2 :(得分:-1)

使用错误的循环

var usr;
for(var i=0; i<userdata.users.length; i++){
    usr = userdata.users[i];
    // do your stuff with usr
}

或:

userdata.users.forEach(function(usr, index, allUsers){
    // do your stuff with usr
});