Mini Linter Project - Assistance Needed

Mini Linter Project

Hello, I need some help with the mini linter project, step 3.
This is my code so far.

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' ];

let storyWords = story.split(' ');

console.log(storyWords.length);
const func = function(b) {
  return b;
}
const betterWords = storyWords.filter(function(a) {
  if (a !== unnecessaryWords.forEach(func)) {
    return a;
  }
});

console.log(betterWords);

It logs the whole storyWords array instead. What’s wrong?
Thanks!

Hi there.

.filter() removes any words which do not pass the test condition.

In your case, everything is meeting your criteria a !== unnecessaryWords.forEach(func)) and so your test function is returning the value of a for each item being passed to filter.

Every value of a is truthy, so nothing is removed.

To fix it, you’ll need to come up with a different way of evaluating the contents of storyWords. :slight_smile:

Hello to all!

Could you please explain why in the mentioned above code for betterWords every value is truthy.

As I understood several words should be the same in both storyWords array and in unnecessaryWords array and should be removed. But it does not works and I am stucked with this question

Thanks

It’s not that every value in betterWords is truthy, the issue is that the filter function being applied to storyWords should return a boolean value and in the above code it always will return the variable a, which takes on the value of each element in storyWords. So a always is a string and a string is truthy. (The only string that is falsy is an empty string ‘’) .

Remember that forEach always returns undefined, what is really being compared is (a !== undefined). Because a always has a value, this comparison will always be true and will return a to the filter function - and again since a is a string filter() will always interpret that as truthy.

You can see this by logging the values and the comparison:

const betterWords = storyWords.filter(function(a) {
    console.log(unnecessaryWords.forEach(func));
    console.log('a: '+ a);
    console.log(a !== unnecessaryWords.forEach(func));
  if (a !== unnecessaryWords.forEach(func)) {
    return a;
  }
});

Hope that clears things up.

Thank you for your reply! I got it with .forEach.

Could you please tell me if the .filter works the same.
I simply tried to eliminate overusedWords and create new array (without them) as in the following code, it doesn`t work. overusedWords still are included in new array

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

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

const storyWords = story.split(' ')
//console.log(storyWords) 
console.log("word number", storyWords.length)

const bestWords = storyWords.filter(word =>{ return word !== overusedWords[word]})

console.log(bestWords)

console.log(overusedWords[word]); and you can see that overusedWords[word] is undefined. This is because you are putting a string in the array bracket. The expression is always evaluating true because a string does not equal undefined.

Think back to the lessons on loops and apply that logic to your filter function - for every word in storyWords, you want to check it against every word in overusedWords.