potnine
potnine

Reputation: 41

Find a substring in a string with for loops

function match(str1, str2) {
  var matched = false
  for (i in str1) {
    if (str1[i] == str2[0]) {
      for (j in str2) {
        if (str2[j] != str1[i]) {
          return false
        } else {
          i++
          matched = true
        }
      }

    }
    return matched
  }

}

console.log(match("umbrella", "rella"))

Can someone fix this code. Is this piece of code good enough. or any improvements. I wanted to find a string in another string with just using the for loops. I saw some answers but they were too complex.

Im a beginner

Upvotes: 1

Views: 765

Answers (3)

Nina Scholz
Nina Scholz

Reputation: 386550

The for ... in statement iterates over the own enumerable keys of the object. This could be handy for objects, but it does not work always for arrays (Why is using "for...in" for array iteration a bad idea?).

Instead use a classic for statement with an index variable from zero to less than the length.


You could take some short circuits and exit early on found and omit iterating over the lengths.

function match(str1, str2) {
    for (let i = 0, l = str1.length - str2.length + 1; i < l; i++) {
        let match = true;
        for (let j = 0; match && j < str2.length; j++) {
            if (str1[i + j] !== str2[j]) match = false;
        }
        if (match) return true;
    }
    return false;
}

console.log(match("umbrella", "rella"));
console.log(match("umbrella", "rello"));

Upvotes: 2

dave
dave

Reputation: 64657

You are returning after only one iteration, change

    }
    return matched
  }
}

to

    }
  }
  return matched
}

That being said, if I'm understanding your code correctly, right now it will fail if it starts to find a match, but then it doesn't match, and there is a match later.

E.g.

console.log(match("umbrerella", "rella"))

function match(str1, str2) {
  var matched = false
top:
  for (i in str1) {
    if (str1[i] == str2[0]) {
      for (j in str2) {
        if (str2[j] != str1[i]) {
          matched = false
          continue top
        } else {
          i++
          matched = true
        }
      }
      if (matched) return true;

    }
  }
  return matched
}

console.log(match("umbrella", "rella"))
console.log(match("umbrella", "della"))
console.log(match("umbrerellas", "rella"))

Upvotes: 2

Andreas
Andreas

Reputation: 40

Why don't you just use:

console.log("umbrella".includes("rella"))

Upvotes: -1

Related Questions