2009-11-08 3 views
0

내가 쓴 다음누구든지 내 자바 스크립트가 잘못된 것을 볼 수 있습니까?

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

답변

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

에이 기능을 적용하는 방법입니다. 나는 내부 색인을 위해 "i"를 "j"로 바꿨다. 닫는 괄호 뒤에 세미콜론을 사용하지 않아도됩니다. 지침 (한 쌍이 누락 된 경우) 후에는 세미콜론을 사용해야합니다.

아마도 "i"문제 이후의 주요 문제는 점수 [i]가 내부 루프 바깥에 설정되어 있어야한다는 것입니다. 이것은 "scores[i] =indexScore[i]}};"대신에 별도의 줄로 구분 된 괄호가 분리되어 있으면 더 명확 해졌습니다.

변수 indexScore이 필요하지 않은 것으로 나타났습니다. 그건 내 안쪽 루프에 scores[i]을 가져 와서 단어 히트를 직접 축적 할 수있게 해 줬다.

마지막으로 글로벌 공간에서 사용할 수 있다고 가정하는 것보다 pages 변수를 인수로 함수에 전달하는 것이 좋습니다. 내가 할 수 있으면 전역을 피하는 경향이 있습니다.

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

Dang, 나중에 나를 때려 : – JasonWyatt

+0

정말 고마워요! 내가 얼마나 많이 복잡하게 만들었는지 믿을 수 없어. 네 도움을 많이 주셔서 고마워. 내가 할 수만 있다면, 지금 당장 당신에게 몇 가지 맥주를 사 줄 것입니다 :-) – Deacon

2

같은 인덱스 변수와 루프 중첩을 가지고 있기 때문에 그것은있을 수 있습니다.

+0

OK 중첩 for-loop의 인덱스 변수 이름을 다른 것으로 변경하려고 시도했으며 이제 "NaN, Nan"으로 경고합니다. 그래서 적어도 배열 점수에 두 개의 인덱스가 있다는 것을 인식하고 있습니다. 단지 그들이 무엇인지 알지 못합니다. – Deacon

+0

indexScore [i]는 할당 된 것으로 보이지 않지만 자신에게 할당하려면 1을 추가 한 다음 indexScore를 할당하려고 시도합니다. 아마도 당신은 거기에있을 것을 기대하고 있습니까? – Myles

+0

글쎄요, scoreScore [i]가 페이지 [i]의 "score"가되도록합니다. 점수는 wordScores의 합계입니다. 일치하는 횟수에 관계없이 각 단어의 wordScore는 1입니다. 그렇지 않으면). 그리스도 이것은 나를 혼란스럽게합니다 ... – Deacon

3

for 루프가 종료되면 iwords.length과 같으며 마지막 인덱스 인 indexScore보다 1입니다. 매번 scores[i]에 아무 것도 지정하지 않습니다.)

// 편집,

+0

나는 당신이 ... words.length가 페이지의 각 색인에있는 단어의 수와 동등한 것에 도달하고 있다는 것을 이해하지 못합니다. indexScore가 해당 페이지 인덱스 내의 모든 wordScores의 합계와 같도록했습니다. – Deacon

0

여기에 [...]

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

나머지는 명백하다는 계산하지, "SUBSTR을"부분 문자열 얼마나 많은 시간을 계산 작은 함수의 "STR"발생 : 이것은 당신이 몇 가지가 있었다 배열

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

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

관련 문제