Javascript Mini Linter

On the Mini Linter project in Javascript Syntax II, I am having incredible difficulty finding a solution that not only works, but works by being an iterator for the step I’m stuck on.

Here’s a link to the project within the lesson plan: Mini Linter

I am currently stuck on Step 4 of the problem… I want to use an iterator, but for some reason, even trying a .sort() method alongside a .forEach() method, I’m unable to sort out the overusedWords from my storyWords array. I’ve also tried using a for loop within the forEach() method, but that was stupid considering it also cycles through the array naturally.

Any help would be appreciated, in the mean time, here’s what I got:

let story = 'Last weekend, I took literally the most beautiful bike ride of my life. The route is called "The 9W to Nyack" and it actually stretches all the way from Riverside Park in Manhattan to South Nyack, New Jersey. It\'s really an adventure from beginning to end! It is a 48 mile loop and it basically took me an entire day. I stopped at Riverbank State Park to take some extremely artsy photos. It was a short stop, though, because I had a really long way left to go. After a quick photo op at the very popular Little Red Lighthouse, I began my trek across the George Washington Bridge into New Jersey.  The GW is actually very long - 4,760 feet! I was already very tired by the time I got to the other side.  An hour later, I reached Greenbrook Nature Sanctuary, an extremely beautiful park along the coast of the Hudson.  Something that was very surprising to me was that near the end of the route you actually cross back into New York! At this point, you are very close to the end.';

let overusedWords = ['really', 'very', 'basically'];

let unnecessaryWords = ['extremely', 'literally', 'actually' ];

// Take string and split it into individual words within an array
const storyWords = story.split(' ');
console.log(storyWords.length); // Outputs # of words within the array

// Filters out the unnecessary words from the array
const betterWords = storyWords.filter(better => {
  if(!unnecessaryWords.includes(better)) {
    return better;
  }
});

// Counts how many times an overusedWords occurs
let count = 0;
const overused = overusedWords.forEach(tooMany => {
  if(overusedWords.includes(tooMany)) {
    return count++;
  }
});

console.log(overused);

So it looks like your current function is checking to see if each string in overusedWords is included in the overusedWords array. If that check results in true, meaning the overusedWords item is in the overusedWords array, it adds one to count.

That’s not quite what you want, but I think you’re on the right track in trying a solution like this. The downside of using .includes() is that it cannot tell us how many matches are in an array, but only that there is or isn’t a match within the array (the .includes() method returns a boolean value). The other thing I notice is in your if statement - I think that there would be a better variable to call the .includes() method on.

A solution that stays true to what you’ve written here (and incorporates some of the other strategies you’ve mentioned) might iterate through the overusedWords array and, in the callback function, iterate through betterWords. Then, in the callback function for betterWords, you might use a condition statement like if to check if the current betterWords string in the iteration matches the current overusedWords string in the iteration - adding 1 to your count every time that conditional returns true. If you try to implement this, pay careful attention to where you initialize your count variable!

I hope that’s helpful! I’ve included a completed version of my proposed solution in the hidden details below. You were on the right track with this, I get myself stuck in similar ways all the time!

Possible solution
const overused = overusedWords.forEach(overusedWord => {
  let count = 0;
  betterWords.forEach(betterWord => {
    if (betterWord === overusedWord) {
      count++;
    }
  })
  console.log(`You have used ${overusedWord} ${count} time(s)`);
})

overused;
2 Likes

I really appreciate the help. I guess I got stuck on using the .includes() method and I didn’t think about nesting iterators, but it makes sense, since it’s similar to nested for loops.

1 Like

No problem! I think we’ve all been stuck like that at one point!

@valtorei I’d appreciate you marking this topic as solved when you get a moment. Thank you!

1 Like