Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop to remove an element in array with multiple occurrences

Tags:

I want to remove an element in an array with multiple occurrences with a function.

var array=["hello","hello","world",1,"world"];  function removeItem(item){     for(i in array){         if(array[i]==item) array.splice(i,1);     } } 
removeItem("world"); //Return hello,hello,1 
removeItem("hello"); //Return hello,world,1,world 

This loop doesn't remove the element when it repeats twice in sequence, only removes one of them.

Why?

like image 205
Eduen Sarceno Avatar asked Dec 22 '13 19:12

Eduen Sarceno


1 Answers

You have a built in function called filter that filters an array based on a predicate (a condition).

It doesn't alter the original array but returns a new filtered one.

var array=["hello","hello","world",1,"world"]; var filtered = array.filter(function(element) {     return element !== "hello"; }); // filtered contains no occurrences of hello 

You can extract it to a function:

function without(array, what){     return array.filter(function(element){          return element !== what;     }); } 

However, the original filter seems expressive enough.

Here is a link to its documentation

Your original function has a few issues:

  • It iterates the array using a for... in loop which has no guarantee on the iteration order. Also, don't use it to iterate through arrays - prefer a normal for... loop or a .forEach
  • You're iterating an array with an off-by-one error so you're skipping on the next item since you're both removing the element and progressing the array.
like image 141
Benjamin Gruenbaum Avatar answered Jan 20 '23 17:01

Benjamin Gruenbaum