2009-11-08 54 views
0

我已经写了以下内容:任何人都可以看到我的Javascript有什么问题吗?

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")); 

功能旨在返回一个阵列(“分数”),其中所述阵列的每个索引是字符串s,在“页的每个索引中找到的次数“数组,不包括方括号内的内容 - 但是,每个单词内只能找到一次字符串。因此,理想情况下,第一个分数索引是1,因为我已经用字母w调用函数,并且我只想在第一个索引索引中找到“WWW”的第一个w - 如果这是有意义的。

我很困惑自己很有史以来这么远,所以我不知道为什么函数返回“,,,,”而不是每个分数索引的数值 - 任何想法?

谢谢

+0

好吧,我不知道格式化出了什么问题。它在预览框中看起来没问题:-s – Deacon 2009-11-08 23:35:50

回答

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]应该设置在内部循环之外。如果将接合部分分离成单独的线而不是像“scores[i] =indexScore[i]}};”那样,这将更清楚。

原来变量indexScore不是必需的。这使我可以在内部循环内部带上scores[i]来直接累计单词匹配。

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

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

Dang,ya击败了我:) – JasonWyatt 2009-11-09 00:15:59

+0

非常感谢!我无法相信我有多么复杂......非常感谢你的帮助。如果可以的话,我会立即为您选购几种啤酒:-) – Deacon 2009-11-09 00:23:38

2

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

+0

OK我已经尝试将嵌套for循环的索引变量重命名为其他内容,现在它会提醒“NaN,Nan”。所以至少它现在认识到将有两个数组分数的索引......它只是不知道它们是什么。 – Deacon 2009-11-08 23:45:19

+0

indexScore [i]似乎没有分配给它,但它试图添加1来分配给自己,然后indexScore。也许你期待有什么东西在那里? – Myles 2009-11-08 23:59:42

+0

嗯,我希望indexScore [i]是页面[i]的“分数”,其中分数是wordscores的总和(如果匹配发生,wordScore为1,无论发生多少匹配。除此以外)。基督这让我很困惑... – Deacon 2009-11-09 00:06:05

3

当您的for环路退出时,i等于words.length,这比最后一个指数indexScore大1。您每次都没有分配scores[i]

+0

我不太明白你在... ... words.length等于每个页面索引中的单词数量。我打算让indexScore等于该页索引内的所有wordScores的总和。 – Deacon 2009-11-08 23:49:39

0

这里的一个小功能,计数多少次串 “SUBSTR” 发生在 “海峡”,不计[...]

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; 
+0

如果只有它...!我可以理解你的功能(只是),但我无法理解如何将它的机制应用于我的功能(特别是,我只想为每个单词计数1次匹配,而不管实际上有多少次匹配发生)。 – Deacon 2009-11-08 23:55:05

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")); 
+0

非常感谢您的回复 - 看起来您在几分钟内被殴打了,但正如我所看到的,这两个回复基本上都是同样,感谢您的帮助:-) – Deacon 2009-11-09 00:36:02

相关问题