Remove Element (JS Algorithm)
This function will remove all instances of an integer from an array of integers. First version uses a second array to accomplish this. Second one uses a nested for-loop. Anyone have a good solution that preforms the operation in place (i.e. not using a second array) and without the dreaded nested-for loop?
Version 1: Solved using second array
var int = 3;
var arr = [3,3,3,3,3];
function removeElement1(int, arr) {
if(typeof int != 'number' && typeof arr != 'object') {
return false;
}
var output = [];
for(var i = 0, len = arr.length; i < len; i++) {
if(arr[i] != int) {
output.push(arr[i]);
}
}
arr = output;
return arr;
}
console.log(removeElement(int, arr));
Version 2: Solved using nested for-loop
var int = 3;
var arr = [3,3,3,3,3];
function removeElement2(int, arr) {
if(typeof int != 'number' && typeof arr != 'object') {
return false;
}
for(var i = 0, len = arr.length; i < len; i ++) {
for(var j = 0; j < len; j++) {
if(arr[j] === int) {
arr.splice(j, 1);
}
}
}
return arr;
}
console.log(removeElement2(int, arr));
Written by shinjukudev
Related protips
4 Responses
Your first function returns the length of the array, so I'm not quite sure if that's what you intended; however, here is a way without a loop.
var int = 3;
var arr = [3,3,3,3,3];
function removeElement(int, arr) {
if(typeof int != 'number' && typeof arr != 'object') {
return false;
}
// build a regexp that will account for commas on either side of the searched number so we can join it and replace all instances of the number
var pattern = new RegExp(int.toString() + "|," + int.toString() + "|" + int.toString() + ",", "g");
arr = arr.join().replace(pattern, "").split(",");
if (arr.join() == "")
{
// this is to account for an array with just one element of an empty string
return new Array();
}
else
{
// return the array that is split
return arr;
}
}
alert(removeElement(int, arr).length);
@jeffcheung Thanks again for the great feedback. I learned a new way of working with reg-ex patterns from your example.
Yes, the return arr.length
was unintended. Fixed the typo now
I noticed that if the first integer in the array matches the integer to be removed, for instance:
var int = 3;
var arr = [3,1,2,3];
The array will be returned as follows, with an empty string at index arr[0]:
["","1","2"]
This case is also different than expected:
var int = 3;
var arr = [2,2,23333,2];
returns:
["2","2","2","2"]
I was expecting the returned array to equal 2,2,23333,2]
So I think this is simply a matter of a different interpretation of the problem.
Hope it helps! :)
js
function removeInstances(arr, elem){
return a.filter(function(i){ return (i !== elem) })
}