for循环在移动javascript之前迭代同一项目3次

时间:2014-01-07 21:28:51

标签: javascript arrays function for-loop

我创建了一个返回字符串最长字的函数。为了实现这一点,字符串已被拆分为一个数组,并使用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');

3 个答案:

答案 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');

http://jsfiddle.net/L7HP5/

答案 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;
}

<强>样本

http://jsfiddle.net/8KQK9/1/

<强>性能

http://jsperf.com/longword