I have an array of elements and need to remove certain ones from it. The problem is that JavaScript doesn't seem to have a for each loop and if I use a for loop I run into problems with it basically trying to check elements beyond the bounds of the array, or missing elements in the array because the indexes change. Let me show you what I mean:
var elements = [1, 5, 5, 3, 5, 2, 4]; for(var i = 0; i < elements.length; i++){ if(elements[i] == 5){ elements.splice(i, 1); } }
The problem is that when elements[1] is removed, elements[2] becomes elements[1]. So first problem is that some elements are never examined. The other problem is that .length changes and if I hard code the bounds, then I might be trying to examine elements beyond the bounds of the array. So what's the best way to do this incredibly simple thing?
Start from the top!
var elements = [1, 5, 5, 3, 5, 2, 4]; for(var i = elements.length -1; i >= 0 ; i--){ if(elements[i] == 5){ elements.splice(i, 1); } }
You could use the filter
method here:
var elements = [1, 5, 5, 3, 5, 2, 4].filter(function(a){return a !== 5;}); //=> elements now [1,3,2,4]
Or if you don't want to touch elements
:
var elementsfiltered ,elements = [1, 5, 5, 3, 5, 2, 4] .filter( function(a){if (a!==5) this.push(a); return true;}, elementsfiltered = [] ); //=> elementsfiltered = [1,3,2,4], elements = [1, 5, 5, 3, 5, 2, 4]
See MDN documentation for filter
Alternatively you can extend the Array.prototype
Array.prototype.remove = Array.prototype.remove || function(val){ var i = this.length; while(i--){ if (this[i] === val){ this.splice(i,1); } } }; var elements = [1, 5, 5, 3, 5, 2, 4]; elements.remove(5); //=> elements now [1,3,2,4]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With