Last Updated: April 20, 2021
·
575
· shinjukudev

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));

4 Responses
Add your response

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);
over 1 year ago ·

@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

over 1 year ago ·

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.

over 1 year ago ·

Hope it helps! :)
js function removeInstances(arr, elem){ return a.filter(function(i){ return (i !== elem) }) }

over 1 year ago ·

Have a fresh tip? Share with Coderwall community!

Post
Post a tip
Did you know?

JavaScript on a page runs with the privileges of that origin. One altered library, tag manager, or snippet can read inputs, change what people see, and call your APIs as the user.

Security insights from Cside