在使用javascript之前,for循环在同一项上迭代3次

在使用javascript之前,for循环在同一项上迭代3次,javascript,arrays,function,for-loop,Javascript,Arrays,Function,For Loop,我创建了一个返回字符串中最长单词的函数。为了实现这一点,字符串被分割成一个数组,并使用循环进行迭代 出于某种原因,For循环在增加其计数之前在同一项上迭代了3次?我看不出有什么明显的错误 这里发生了什么,我该怎么阻止它?还有没有更好的方法来实现我在这里的目标?我对javascript比较陌生 function longWord(str) { var wordArr = str.split(' '); var highest = 0; var longestWd ; for(var i = 0;

我创建了一个返回字符串中最长单词的函数。为了实现这一点,字符串被分割成一个数组,并使用循环进行迭代

出于某种原因,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');
函数长字(str){
var-wordArr=str.split(“”);
var最高=0;
长叶变种;
对于(变量i=0;i最高值){
最高=温度;
longestWd=单词;
}
警报(最长WD);
警报(最高);
}
}
longWord('这是一个包含最长单词的字符串');

您的警报在您的循环中。因此,对于每个被测试的单词,最长的单词及其长度都会被提醒

例如:

测试时间最长
----     -------

这您的代码很好。如果将警报替换到
控制台.log
中,请按以下方式调用:

console.log(i, word, longestWd)
function longWord(str){
    return str.split(' ').reduce(function(a, b){
       return a.length > b.length ? a : b;
    });
}
您可以看到它按预期工作:

0 "this" "this"
1 "is" "this" 
2 "a" "this" 
3 "string" "string"
4 "with" "string" 
5 "a" "string" 
6 "longest" "longest"
7 "word" "longest" 

这样做的一个好方法是使用:

console.log(i, word, longestWd)
function longWord(str){
    return str.split(' ').reduce(function(a, b){
       return a.length > b.length ? a : b;
    });
}
reduce()
方法对累加器和每个累加器应用函数 数组的值(从左到右)必须将其减少为单个值 价值观


你的代码没有错。它只是在“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;
}
函数长字(a){
a=a.分割(“”);
var b=a.长度,
c='';
而(b){
c=c。长度
演示

性能


在测试句子的前三个单词中,哪一个是最长的?除了其他答案之外,如果你包含了一个像下划线或短划线这样的库,你只需将一个键函数传递给
.max
并使用它来获得max元素:
.max(str.split(“”),function(word){return word.length;})
yours仍然会运行3次(顺便说一句,如果你将警报放在循环中,这本不应该发生,我想这是OP所问的)@Noctis抱歉,我不确定你的意思。你能帮我澄清一下吗?把警报放在循环中,你会把每个单词输出3次,这就是OP所问的。(在他的例子中,你可能会看到所有的单词,在你的例子中,你只看到最长的单词)它不是多次测试同一个单词。它只是针对每个测试的单词提醒最长的单词一次。在测试的前三个单词中,最长的单词保持不变,这可能使它看起来像是在测试同一个单词三次。我用一个例子更新了我的答案。。。符合事实的真不敢相信我错过了:)我认为这回答了OP问题“更好的方式”的好答案,关于OP被问到的3次问题仍然是个谜(顺便说一句,根据jsperf,这个解决方案由于某些原因要慢得多)我这样做,所以我(和其他ppl)如果我在不久的将来需要代码,我可以复制并通过。我也可以手工操作,因为缩略语不能正确处理速记和按位运算符。你使用的缩略语是什么?没有像样的迷你们会破坏你的密码。我不使用迷你们。我学会了用速记和按位运算符写作。我也不使用jquery。我用记事本写代码。或者jsfiddle。别开玩笑了。如果没有空格,你很难阅读代码。我很难阅读充满新行、制表符和空格的简单代码。看起来你不是在开玩笑。编程语言是为人类阅读而编写的。手工缩小它们绝对不会给你带来任何好处,只会留下一堆无法维护的文本。