我有1000个值的数组。
var city = city_str.split(',');
是按字母顺序排列的城市。
我具有搜索以自变量声明的字母开头的第一个单词的功能。
function searchWord(letter){
letter = letter.toUpperCase();
var letters = city.map(n => n[0]);
var word = '';
var flag = false;
for (var i = 0; (i<= letters.length)&&(flag); i++){
if (letter == letters[i]) {
word = city[i];
flag = true;
}
}
if (word == '') {
return 0;
}
else return word;
}
但总是返回0。为什么?
答案 0 :(得分:1)
一开始,您的for
循环条件(i<= letters.length)&&(flag)
为假,因为您要求flag
为true
,但您已设置{{1} }到flag
就在循环之前。请记住,false
的意思是“和”。
您可能是说&&
。另外,请注意,在将!flag
与<
进行比较时,您需要<=
,而不是i
。因此:letters.length
还请注意,您不需要这些括号,并且我可以谨记建议i < letters.length && !flag
和缩进的一致使用。所以:
{}
或者您可以从循环内返回而完全避免使用function searchWord(letter){
letter = letter.toUpperCase();
var letters = city.map(n => n[0]);
var word = '';
var flag = false;
for (var i = 0; !flag && i < letters.length; i++) {
if (letter == letters[i]) {
word = city[i];
flag = true;
}
}
if (word == '') {
return 0;
} else {
return word;
}
}
(和flag
):
word
实际上,您可以完全避免使用function searchWord(letter){
letter = letter.toUpperCase();
var letters = city.map(n => n[0]);
for (var i = 0; i < letters.length; i++) {
if (letter == letters[i]) {
return city[i];
}
}
return 0;
}
,因为如果for
是一个数组(我假设来自city
),则可以使用find
:
map
function searchWord(letter){
letter = letter.toUpperCase();
return city.find(n => n[0] == letter) || 0;
}
反复调用您的回调,直到它返回真实值或用尽所有条目。如果回调函数返回真实值,则find
的返回值就是回调函数所针对的条目;否则,返回find
。由于我们知道undefined
中的单词不会虚假,因此我们可以安全地使用city
将该|| 0
转换为undefined
。
答案 1 :(得分:0)
这是因为条件导致循环未执行
for (var i = 0; (i<= letters.length)&&(flag); i++)
flag
设置为false。因此,您的循环将不会执行。
将此行更改为:
for (var i = 0; (i< letters.length)&&(!flag); i++)