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:

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)) {
    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?


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… :face_with_raised_eyebrow:

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! :slight_smile:

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