我创建了一个返回字符串最长字的函数。为了实现这一点,字符串已被拆分为一个数组,并使用for loop
进行迭代。
出于某种原因,for循环在增加计数之前在同一项上迭代3次?我没有看到明显的错误。
这里发生了什么,我该如何阻止它?还有更好的方法来实现我在这里尝试做的事情吗?我对javascript比较陌生。
function longWord(str) {
var wordArr = str.split(' ');
var highest = 0;
var longestWd ;
for(var i = 0; i < wordArr.length; i++) {
var temp = wordArr[i].length
var word = wordArr[i];
if(temp > highest) {
highest = temp;
longestWd = word;
}
alert(longestWd);
alert(highest);
}
}
longWord('this is a string with a longest word');
答案 0 :(得分:5)
你的代码很好。如果您将警报替换为console.log
这样的呼叫:
console.log(i, word, longestWd)
你可以看到它按预期工作:
0 "this" "this"
1 "is" "this"
2 "a" "this"
3 "string" "string"
4 "with" "string"
5 "a" "string"
6 "longest" "longest"
7 "word" "longest"
执行此操作的一种好方法是使用reduce
这样:
function longWord(str){
return str.split(' ').reduce(function(a, b){
return a.length > b.length ? a : b;
});
}
reduce()
方法对累加器和每个应用函数 数组的值(从左到右)必须将其减少为单个 值。
答案 1 :(得分:2)
您的警报在您的循环中。因此,对于每个被测试的单词,将提醒最长的单词及其长度。
例如:
TEST LONGEST
---- -------
this this <- these are the three you are talking about
is this <- these are the three you are talking about
a this <- these are the three you are talking about
string string
with string
a string
longest longest
word longest
尝试在for循环之外移动警报,以便在所有单词经过测试后发生警报,如下所示:
function longWord(str) {
var wordArr = str.split(' ');
var highest = 0;
var longestWd;
for (var i = 0; i < wordArr.length; i++) {
var temp = wordArr[i].length
var word = wordArr[i];
if (temp > highest) {
highest = temp;
longestWd = word;
}
}
alert(longestWd);
alert(highest);
}
longWord('this is a string with a longest word');
答案 2 :(得分:0)
您的代码没有错。它只是在'this'上迭代3次,因为它是最长的单词。
根据您的代码:
function longWord(a){
a = a.split(' ');
var b = a.length,
c = '';
while(b--){
c = c.length < a[b].length ? a[b] : c
}
return c;
}
<强>样本强>
<强>性能强>