# Question about 'Drop It' Exercise

Hi all,

There’s something that has been bothering me about the exercise ‘Drop It’ since the other day when I did it. For reference, the exercise is here: https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/drop-it

The thing is that my first instict was to use `shift()` like this:

``````function dropElements(arr, func) {

for (let element of arr) {
if (!func(element)) {
arr.shift();
console.log(arr)
}
else {
return arr;
}
}

return arr;
}

//dropElements([1, 2, 3, 4], function(n) {return n >= 3;})
dropElements([1, 2, 3, 4], function(n) {return n >= 4;})
``````

However, if you try the two examples at the end and see the console.log, you’ll see that there’s always an element that should have been “shifted” but isn’t:

• For the first example, the returned array is [2, 3, 4]
• For the second example, it’s [3, 4].
So it feels like the loop would need to execute one more time but doesn’t.

I solved the exercise with slice, but still bothers me not knowing why shift doesn’t work (the rest of the code with slice is the same except arr = arr.slice(1) instead of the shift() line).

Does anybody know?

Thanks!

``````function dropElements(arr, func) {

// Cannot loop array as the arr is changing, first element is dropped
// The element to check is always the first element

while (!func(arr[0])) {
arr.shift(); // remove first element
}

return arr;
}
console.log(dropElements([1, 2, 3, 4], function(n) {return n >= 3; }));

``````

That’s what I thought at first, but on the second example ( `return n >= 4`) it removes both the 1 and the 2, but then not the 3, which is what threw me off…

Hint: Place a console.log(element) right before the arr.shift() to see what it does.

I just finished my own “drop it” this morning. Took me a few tries, but my final solution looks simple…^^

Hmmm interesting… That was not how I was expecting the loop and the if statement to behave with the array and shift… That’s odd!

You cannot loop something that is changing. That is why I used a while statement as in my example.

1 Like

I used filter and had a help in stackoverflow to make it work!

``````function dropElements(arr, func) {
return arr.filter((b => v => b ||= func(v))(false));;
}
``````