2009-11-08 55 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

相關問題