我正在尝试使用两个参数创建一个函数,一个用于数组(ary),另一个用于在数组内搜索的名称。
但是,我不明白为什么第一个代码不起作用而第二个代码不起作用。
有人可以解释一下吗?
// wrong code
var fruit = ['banana', 'apple', 'cherry', 'watermelon'];
var food = ['pizza', 'rice', 'cheese', 'potato'];
var search = function(ary, name) {
for (var i = 0; i < ary.length; i++) {
if (name == ary[i]) {
return name + " was found!";
} else {
return name + " was not found";
}
}
};
search(food, 'potato');
//"potato was not found"
// right code
var fruit = ['banana', 'apple', 'cherry', 'watermelon'];
var food = ['pizza', 'rice', 'cheese', 'potato'];
var search = function(ary, name) {
for (var i = 0; i < ary.length; i++)
if (name == ary[i])
return name + " was found!";
return name + " was not found";
};
search(food, 'potato');
//"potato was found!"
谢谢!
答案 0 :(得分:3)
在第一个示例中,您将返回第一个匹配失败,因此在它无法匹配数组的第一个项目后,它将从函数返回。
所以else块中的部分应该移到循环之外。
答案 1 :(得分:1)
因为在第一个函数中,你在一次迭代后立即返回;你不等待整个阵列循环;我敢打赌数组的第一个元素是&#39;找到&#39;。
因此,对于您的第一个功能,将会找到以下内容:
search(fruit, 'banana');
search(food, 'pizza');
但没有其他人。
在第二个中,返回&#39;未找到&#39;只有当整个数组在没有找到匹配的情况下循环通过时才会发生,即当它退出for循环时。
答案 2 :(得分:1)
我看到了问题。
在第一个代码段中,您在else语句中返回false。这意味着第一次通过循环,你将返回true或false。它只检查第一项。
答案 3 :(得分:1)
在您的第一个版本中,else
位于for
循环内,因此该函数将始终返回&#34;已找到&#34;或&#34;未被发现&#34;在第一次迭代中。循环永远不会到达第二次迭代。
在您的第二个版本中,else
不是for
循环体的一部分,因此它仅在循环结束(运行其所有迭代)后才运行,而不会找到匹配项。
答案 4 :(得分:1)
for (var i = 0; i < ary.length; i++)
if (name == ary[i])
return name + " was found!";
return name + " was not found";
与:
相同for (var i = 0; i < ary.length; i++) {
if (name == ary[i]) {
return name + " was found!";
}
}
return name + " was not found";
循环遍历数组中的所有项后返回false
。在您提供的错误代码中,它仅检查第一项是否等于name
,因为在循环内部无论是否找到它都会返回(如果第一项等于name
它会返回true
,否则会返回false
)所以索引1
中的项目不会被检查,因为该函数已经返回。
注意:您可以使用JS中的默认搜索功能:indexOf
,如下所示:
var search = function(ary, name) {
if(ary.indexOf(name) != -1) // index is -1 (not valid) then it's not found
return name + " was found";
else
return name + " was not found";
}