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

この関数は、配列( "scores")を返すことを目的としています。ここで、配列の各インデックスは、角括弧内にあるものを除いて、 "pages"配列の各インデックスで文字列sが見つかった回数です。ただし、文字列は各単語内で1回です。したがって、理想的には、スコアの最初のインデックスは1になります。これは、文字wを使用して関数を呼び出したためです。これが理にかなっている場合は、ページの最初のインデックスで「WWW」の最初のwを検索するだけです。

私はここまで到達するのにかなり叙事詩的に混乱しているので、関数がスコアの各インデックスの数値ではなく「、、、、」を返す理由がわかりません-何かアイデアはありますか?

ありがとう

4

5 に答える 5

3

forループが終了すると、iはに等しくなりますwords.length。これは、の最後のインデックスより1大きい値ですindexScorescores[i]毎回、何も割り当てていません。

于 2009-11-08T23:39:57.620 に答える
2

同じインデックス変数を持つネストされたforループがあることが原因である可能性があります。

于 2009-11-08T23:39:29.727 に答える
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」の問題の後)は、scores[i]が内側のループの外側に設定されている必要があるということでした。これは、コーシングパレンが ""のようにではなく、別々の行に分割されていれば、より明確になりますscores[i] =indexScore[i]}};

indexScore変数は不要であることが判明しました。これによりscores[i]、内側のループ内に移動して、単語のヒットを直接蓄積することができました。

pages最後に、変数がグローバルスペースで使用可能であると想定するよりも、変数を引数として関数に伝達したいと思います。可能であれば、グローバル変数を避ける傾向があります。

var pages = [...];
function findScoresC(pages, s)
{
   ...
}
alert(findScoresC(pages, "w"));
于 2009-11-09T00:13:36.070 に答える
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;
于 2009-11-08T23:50:40.180 に答える
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"));
于 2009-11-09T00:24:46.273 に答える