在遍历数组后显示警告时出现问题

时间:2017-12-03 16:52:09

标签: javascript

我有一个输入字段,用户输入他们的邮政编码然后尝试匹配数组中的邮政编码。虽然以下工作,我需要它实际显示一个警告对话框,一旦说没有找到邮政编码,但是,即使邮政编码在列表中,它也会弹出很多。

这是我的代码段:

_zipcodeBtn.onclick = function(){
  var userZip = _zipcode.value;

  for (var i = 0; i < zipcode_list.length; i++) {
    if (zipcode_list[i] === userZip) {
      console.log('works');
      break;
    } else {
      alert("repeating");
    }
  }
};

我希望它检查他们的zip是否可用而没有它也多次重复else语句。什么是阻止这种情况的最好方法?

2 个答案:

答案 0 :(得分:2)

通过引用数组的indexOf()方法(docs),可以更轻松地查找数组中的项目。

if (zipcode_list.indexOf(userZip) != -1) {
    //found - do something
} else
    alert('Zip not found!');

正如Angel Politis所示,如果你只是想知道一个项目是否在一个数组中,而不是它在其中的实际位置,你也可以使用includes()

旁注:使用indexOf()时检查-1非常重要,因为它返回找到搜索的索引 - 如果不是则返回-1。如果在第一个键处找到搜索,则该值为0,而0是一个假值,当他们执行以下操作时,有时可能会将人员赶出:

var arr = [1, 2, 3];
if (arr.indexOf(1))
    alert('success');
else
    alert('failed');

你认为成功警报会在这里触发,但实际上它会成为失败警报,因为在这种情况下indexOf()返回0,而当它是&#39时0是一个假值在一个条件下审讯。

答案 1 :(得分:1)

这里不需要使用循环。你可以说:

if (!zipcode_list.includes(userZip)) alert("Doesn't work!");

如果必须使用循环,则只需将标记设置为false,然后,如果找到zip,则将其设置为true。然后你可以在循环外检查它:

/* Create a flag and set it by default to false. */
var found = false;

/* Loop */
for (var i = 0, l = zipcode_list.length; i < l; i++) {
  if (zipcode_list[i] === userZip) {
      /* Set the flag to true and stop the loop. */
      found = true;
      break;
  } 
}

 /* Check whether the zip was found in the array. */
 if (found) console.log("Works!");
 else alert("Doesn't work!");