Codecademy课程的麻烦

时间:2012-12-09 17:52:27

标签: javascript

我正在通过Codecademy学习JavaScript,但我有一个问题。下面的代码应该在text变量中搜索myName变量作为我的名字,然后将所有单个字母推送到hits数组。我写的代码不正确,但Codecademy说这是正确的,并且让我继续上课。

我一直试图解决我没有运气的问题。问题是,当我运行hits.push(text);行时,它将输出整个变量,但我已经尝试了hits.push(text[i]);并且未定义结果。有人可以帮我理解我犯了哪些错误吗?

/*jshint multistr:true */
var text = "XsddfasASSFABrandonSFsdfdasBrandonsddfadfaBrandon";
var myName = "Brandon";
var hits = [];
for (i=0; i<=text.length;i++){
    if (text[i]===myName[i]){
        for(var x=i; x<i+myName.length;x++){
            hits.push(text);
        }
    }
}
if (hits.length===0){
    console.log("Your name wasn't found!");
} else {
    console.log(hits);
}

4 个答案:

答案 0 :(得分:2)

通常情况下,您会使用indexOfmatchsearchsubstrsubstring执行此类操作,这些都是string methods

但是,为了本练习的目的,你可以这样做:

var text = "XsddfasASSFABrandonSFsdfdasBrandonsddfadfaBrandon";
var myName = "Brandon";
var hits = [],
    namePosition = 0;
for (var i = 0; i < text.length; i++) {
    if (text[i] === myName[namePosition]) {
        hits.push(text[i]);
        namePosition ++;
        if (hits.length === myName.length) {
            break;
        }
    }
    else {
        namePosition = 0;
        hits = [];
    }
}
if (hits.length === 0) {
    console.log("Your name wasn't found!");
} else {
    console.log(hits);
}​

(见http://jsfiddle.net/wCWxr/1/工作)。您原始代码的问题包括:

  1. 您尝试将text[i]myName[i]进行比较,但两个字符串的索引不匹配。

  2. 您尝试将整个字符串text推送到hits而不是一次推送一个字符

  3. 您的逻辑不处理myName的开头但不是text的结尾的可能性,例如如果文字是aerwerBrasdfsgars

  4. 我的建议通过记录(namePosition)我们当前在字符串myName中的位置来修复此问题,并在text找到与相关字符匹配的字符时递增myName中的字符。如果字符不匹配,那么它不是真正的匹配,因此我们重置hits = []namePosition = 0。如果所有字符都匹配,那么hits最终会达到myName的长度,因此我们就会脱离循环。

答案 1 :(得分:2)

我能想出来解释你的错误的最好方法就是简单地介绍一下你所写的一些逻辑。

for (i=0; i<=text.length;i++){

您的for循环将迭代itext变量中的字符一样多,所以:49次。

if (text[i]===myName[i]){

第一次浏览for循环,其中i=0,您正在检查text[0]是否严格等于myName[0]text[0] = XmyName[0] = B。不满足严格等于条件,因此循环继续递增i重复:text[1] = smyName[1] = r。这种情况持续了47次,而且情况从未得到满足。在前7个循环之后,myName[i]未定义。

答案 2 :(得分:0)

如果您正在尝试查找我的姓名是否在文字中,请执行以下操作:

正则表达式:

var pattern = new RegExp(myName);
if (pattern.test(text)){
    console.log(myName);
}else {
    console.log("Your name wasn't found!");
}

的indexOf:

if (text.indexOf(myName) != -1){
    console.log(myName);
}else {
    console.log("Your name wasn't found!");
}

答案 3 :(得分:0)

if (text[i]===myName[i]){  

此行应该创建错误,因为myName [i]不是myName的第一个字母。

if (text[i]===myName[0]){

更改此行应该有效。