0

我正在运行以下代码来获取显示单词 Eric 的字母的相关输出。

/*jshint multistr:true */

text = "My name is Eric. Eric lives in New York";
var myName = "Eric";
var hits = [];

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

我能够获得所需的输出,即['E', 'r', 'i', 'c', 'E', 'r', 'i', 'c']

但是,当我在代码的第 8 行输入“​​l”时,会得到以下输出: [ 'l', 'i', 'v', 'e', 's', ' ', 'i' ]

根据我的理解,代码应该返回一条消息Your name was not found!.

相反,它仍在处理字母l之后的字符并将其作为输出返回。

如何以更好的方式优化我的代码,以确保仅搜索字符串Eric中的字符并将其作为输出返回,而任何其他字符都将被拒绝?

4

4 回答 4

2

如果 Eric 完全匹配,那么它只会将其放入数组中。

例如(Eric 在数组中,但 Eriic 不在)

工作演示http://jsfiddle.net/9UcBS/1

text = "My name is Eric. Eric lives in New York Eriic";
var myName = "Eric";
var hits = [];

var pos = text.indexOf(myName);
while (pos > -1) {
    for (var j = pos; j < (myName.length + pos); j++) {
        hits.push(text[j]);
    }
    pos = text.indexOf(myName, pos + 1);
}
(hits.length === 0) ? console.log("Your name wasn't found!") : console.log(hits);
于 2013-07-20T06:11:50.297 回答
1

在这种情况下使用正则表达式会容易得多:

var name = "Eric";
var text = "My name is Eric. Eric lives in New York";
var hits = [];
var regexp = new RegExp(name, "g");
var match;
while (match = regexp.exec(text)) {
    hits.push(match[0]);
}
console.log(hits);

exec与“g”标志一起使用时,每次调用都会将字符串中的位置向前移动。所以在第一次迭代中,你会得到第一个 Eric,然后第二个会找到下一个,以此类推。有关详细信息,请参阅mdn

在这个循环之后,hits 将是字符串“Eric”的数组。如果你想要像以前一样的字符数组,你可以使用一个简单的技巧:

while (match = regexp.exec(text)) {
    hits = hits.concat([].slice.call(match[0]));
}

或者,如果您想直接使用 for 循环:

while (match = regexp.exec(text)) {
    for (var i = 0; i < match[0].length; i++) {
        hits.push(match[0][i]);
    }
}
于 2013-07-20T05:53:21.577 回答
0

字符串不是字符数组。要从字符串的位置获取字符,您需要使用该charAt方法,如下所示:

if ( text.charAt(i) == "E" ) {
    //...
}

甚至更好:

if ( text.charAt(i) == myName.charAt(0) ) {
    //...
}
于 2013-07-20T05:53:02.317 回答
0

使用 indexOf() 查找字符串出现的一个很好的示例位于:https ://stackoverflow.com/a/3410557/2577572

上面链接的示例的结果将为您提供您正在搜索的字符串的位置数组。如果调用上面详述的函数后数组没有长度,那么你的名字没有找到。

我认为您实际上不需要创建一个由搜索字符串组成的字母数组,因为根据您的示例,它们每次都与搜索字符串相同。

于 2013-07-20T05:54:03.250 回答