任何人都可以看到我的Javascript有什么问题吗?

时间:2009-11-08 23:33:49

标签: javascript arrays nested-loops

我写了以下内容:

var pages=["[www.google.co.uk] This is the WWW. ","[www.yahoo.co.uk] This is also the WWW. "];
function findScoresC(s){ 
var scores=[];
var words=[];
var wordScore;
var indexScore=[];
s=s.toLowerCase();
for(i=0;i<pages.length; i++){
   var lowerCaseContents=(pages[i].substring(pages[i].indexOf("]")+1,pages[i].lastIndexOf(" "))).toLowerCase();
   words=lowerCaseContents.split(" ");
   for(i=0;i<words.length;i++){
    if(words[i].match(s)){
        wordScore=1;
        indexScore[i]=indexScore[i]+1};
   scores[i] =indexScore[i]}};
return scores;
}
alert(findScoresC("w"));

该函数旨在返回一个数组(“得分”),其中数组的每个索引是在“pages”数组的每个索引中找到字符串s的次数,不包括方括号内的内容 - 但是,只在每个单词中找到一次字符串s。理想情况下,得分的第一个索引是1,因为我用字母w调用了函数,我只希望在第一个页面索引中找到第一个w“WWW” - 如果这是有道理的。

我已经非常混淆了这一点,所以我不知道为什么函数返回“,,,,”而不是每个分数指数的数值 - 任何想法?

由于

5 个答案:

答案 0 :(得分:3)

当您的for循环退出时,i等于words.length,这比indexScore的最后一个索引大一个。您每次都没有为scores[i]分配任何内容。

答案 1 :(得分:2)

可能是因为你有一个带有相同索引变量的嵌套for循环。

答案 2 :(得分:1)

var pages=["[www.google.co.uk] This is the WWW. ","[www.yahoo.co.uk] This is also the WWW. ";

function findScoresC(s){ 
  var scores=[];
  var words=[];
  s=s.toLowerCase();
  for(i=0;i<pages.length; i++)
  {
     scores[i]=0;
     var lowerCaseContents=(pages[i].substring(pages[i].indexOf("]")+1,pages[i].lastIndexOf(" "))).toLowerCase();
     words=lowerCaseContents.split(" ");
     for(j=0;j<words.length;j++)
     {
        if(words[j].match(s))
        {
          scores[i] += 1;
        }
      }
  }
  return scores;
}
alert(findScoresC("w"));

有一些事情。我用“j”替换了“i”作为内部索引。关闭后,您不需要分号。指示后你应该有一个分号(一对夫妇失踪)。

可能主要问题(在“i”问题之后)是得分[i]应该在内循环之外设置。如果将切口的parens分成不同的行,而不是像“scores[i] =indexScore[i]}};”那样,那就更清楚了。

事实证明,变量indexScore不是必需的。这允许我将scores[i]带入内循环以直接累积单词命中。

最后,我更愿意将pages变量作为参数传递给函数,而不是假设它在全局空间中可用。如果可以的话,我倾向于避免使用全局变量。

var pages = [...];
function findScoresC(pages, s)
{
   ...
}
alert(findScoresC(pages, "w"));

答案 3 :(得分:0)

这是一个小函数,计算子串“subStr”在“str”中出现的次数,不计算[...]

function substrCount(str, subStr) {
   var str = str.replace(/\[.+?\]/g, "");
   var del = str.toLowerCase().split(subStr.toLowerCase()).join("");
   return (str.length - del.length) / subStr.length;
}

其余的很明显;)

//编辑:这是将此函数应用于数组的方法

 var someArray = ["whatever", "something", "else" ];
 var counter = [];
 for(var i = 0; i < someArray; i++)
      counter[i] = substrCount(someArray[i], "something");
      // or, to count only one match, i.e. just to test if a substring is present
      counter[i] = substrCount(someArray[i], "something") > 0;

答案 4 :(得分:0)

这是你修复的功能。它会返回[1,1],这似乎就是你想要的。我的笔记在代码中。

var pages=["[www.google.co.uk] This is the WWW. ","[www.yahoo.co.uk] This is also the WWW. "];

function findScoresC(s){ 
    var scores = [],
        words = [],
        wordScore;
        // indexScore = [] <- this doesn't seem necessary
    s = s.toLowerCase();

    // Make sure to use `var i` and not just `i`; otherwise, you are creating a global variable.
    for ( var i=0; i<pages.length; i++ ) {
        // Initialize me!
        scores.push(0);

        var lowerCaseContents = pages[i].substring(
            pages[i].indexOf("]") + 1, pages[i].lastIndexOf(" ")
        ).toLowerCase();
        words = lowerCaseContents.split(" ");

        // You were using `i` for this loop as well.  No can do.
        for ( var j=0; j<words.length; j++) {
            if ( words[j].match(s) ) {
               // wordScore = 1;  <- I don't know what you're using this for
               scores[i]++;
            }
        }
    };

    return scores;
}

console.log(findScoresC("w"));