请帮助我理解为什么我的代码没有对我的预期做出反应?
所以我在for循环中迭代值列表,然后如果它们与表单提交的值匹配,它应该返回该值,如果它不匹配,它应该返回-1 。如果我遗漏了其他的'在if条件中的语句,它工作(如果没有匹配的值,显然不返回-1)。但是使用else,它只会返回第一个值(如果已输入)(在这种情况下为10),否则它将始终返回-1。 (如果我输入20,它将返回-1,即使它在我的值列表中)
我在这里缺少什么/不理解?
// reference the form
var myForm = document.getElementById('findValue');
// our list of random values
var values = [10,20,30,40,50,60,70,80,90,100,234,255,345,366,900,1000,1002,1025,2034];
// on form submit
myForm.onsubmit = function(evt) {
var valueToFind = document.getElementById('myValue').value;
// do not let it refresh the page/send a query
evt.preventDefault();
for(var i = 0; i < values.length; i++) {
if(valueToFind == values[i]) {
alert(values[i]);
}
else {
alert(-1);
return false;
}
}
};
非常感谢你!
答案 0 :(得分:2)
你不会让它搜索到最后。第一次没有匹配,它会返回。
您应该在找到匹配后立即发出警报,并返回true
以允许提交。如果不匹配,则在循环后返回false
。
myForm.onsubmit = function(evt) {
var valueToFind = document.getElementById('myValue').value;
// do not let it refresh the page/send a query
evt.preventDefault();
for(var i = 0; i < values.length; i++) {
if(valueToFind == values[i]) {
alert(values[i]);
return true;
}
}
alert(-1);
return false;
};
编辑:当我认为您的意思是其他内容时,您的问题会使用作品return
。
答案 1 :(得分:0)
在查看第一项后,您总会以这种或那种方式返回。如果第一个不是mathc,你必须继续循环:
for(var i = 0; i < values.length; i++)
{
if(valueToFind == values[i])
{
alert(values[i]);
return values[i];
}
}
// only return false after the loop is complete with no match.
alert(-1);
return false;
答案 2 :(得分:0)
return false
将结束循环,即使它没有,您也会为每个不是输入的项目添加-1
警报。
对于这种类型的搜索,您应该检查条件是否为真,此时您使用return
执行某些操作,并忽略else
。然后,在 for
循环之后,执行“如果没有匹配”代码。
答案 3 :(得分:0)
这种情况发生的原因是,一旦发现你应该打破循环而不是下一次迭代,而当没有找到时,循环不应该与return false
决裂。
但是,在你的情况下,我会在循环后使用标志found
和标志检查:
var found = false;
for (var i = 0; i < values.length; i++) {
if (valueToFind === values[i]) {
found = true;
break;
}
}
alert(found ? valueToFind : -1);
另一个简短的方法是使用Array.indexOf
方法:
alert(values.indexOf(valueToFind) > -1 ? valueToFind : -1);