1

我是编程新手,目前正在CodeAcademy上学习 javascript 。下面的代码来自教程,程序将搜索字符串以查找名称。程序将遍历数组,将每个字母与你名字的第一个字母进行比较,如果它看到那个字母:它将把那个字母和它后面的所有字母推到一个数组中,当它推入的字母数量时停止等于你名字中的字母数。

我不明白的是这条线:for (var j = i; j < (myName.length + i); j++) 为什么j <(myName.length + i)而不是j<(myName.length)?如果“Eric”的字母“E”是字符串中的第 25 个字符,那么j<(myName.length + i) = j<("4" + "25")这不是错误的,因为正确的代码应该是j<("4")4 是名称 Eric 的长度。

我试过运行代码,j<(myName.length)但它无法工作,我似乎无法理解为什么。

text = "Blah blah blah blah blah blah Eric \
        blah blah blah Eric blah blah Eric blah blah \
        blah blah blah blah blah Eric";

var myName = "Eric";
var hits = [];

// Look for "E" in the text
for(var i = 0; i < text.length; i++) {
    if (text[i] == "E") {
        // If we find it, add characters up to the length of my name to the array
        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);
}
4

3 回答 3

2

在您的内部循环中,您正在执行以下操作:

for(var j = i;

当条件if (text[i] == "E") {得到满足时, 的值i非常高(30)。

现在,当你这样做时:

for(var j = i; j < (myName.length); j++) {

你基本上是在做这个-

 for(var j = 30; j < 4; j++) {

所以循环永远不会开始;因为边界条件不满足。

但是当你这样做时:

for(var j = i; j < (myName.length+i); j++) {

那么你正在这样做:

for(var j = 30; j < (30+4) ; j++) {

因此,一切正常,它应该的方式。

于 2013-04-14T08:16:15.333 回答
1

我希望你在以后的项目中不要使用上面的代码 :)

text = 'Blah blah blah blah blah blah Eric blah blah blah Eric blah blah Eric blah blah blah blah blah blah blah Eric';
var hits = text.match(/Eric/g) || [];
if (hits.length) {
  console.log('Your name was found ' + hits.length + ' times');
}
else {
  console.log('Your name wasn\'t found!');
}
于 2013-04-14T08:20:59.037 回答
0

如果我理解正确,您提供的代码可以正常工作,您不明白为什么?如果是这样,这是我的解释:

两者ij标记中的位置texti在 中初始化为零for(var i = 0; i < text.length; i++) {。循环的工作方式是它将i根据条件进行评估i < text.length;,如果为真,那么它将运行代码块,执行您的迭代器(i++这意味着将 1 添加到 i),然后通过评估条件来开始循环再次。

您会注意到它j被初始化为i而不是零。那么发生的情况是,如果i字符串位置的字母text是“E”,那么它将开始另一个循环,设置ji(在上面的情况下为 25),然后向前迭代你的名字的长度。我相信这种情况让你感到困惑:

for(var j = i; j < (myName.length + i); j++) {

所以让我来看看这个循环会发生什么:

起初它会设置j为 中的当前位置text,这很方便i知道。所以假设i已经达到 25。所以循环设置j为 25 via i。现在,由于我们想要 的下一个四个字符,而不是四个字符,text因此条件设置为j < (myName.length + i)

由于“Eric”是四个字符,因此它将添加text[25]text[26]text[27]text[28]hits如果你看一下texts,你会注意到第 25 到第 28 个字母是(应该是)你的名字。

于 2013-04-14T08:48:34.160 回答