我写了以下内容:
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” - 如果这是有道理的。
我已经非常混淆了这一点,所以我不知道为什么函数返回“,,,,”而不是每个分数指数的数值 - 任何想法?
由于
答案 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"));