Arthur Yakovlev
Arthur Yakovlev

Reputation: 9309

Remove object from array of objects

I have an array of objects:

[{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]

How I can delete this item {"value":"14","label":"7"} resulting in the new array:

 [{"value":"14","label":"7"},{"value":"18","label":"7"}]

?

Upvotes: 45

Views: 75346

Answers (9)

superluminary
superluminary

Reputation: 49152

Solution with Identity

If you have object identity not just object equality (i.e. you're trying to delete a specific object from the array, not just an object that contains the same data as an existing object) you can do this very simply with splice and indexOf:

a = {x:1}
b = {x:2}
arr = [a,b]

Say you want to remove b:

arr.splice(
  arr.indexOf(b), 1
);

Solution with Equality

The question makes it unclear whether we are dealing with identity or equality. If you have equality (two objects containing the same stuff, which look the same as each other, but are not actually the same object), you'll need a little comparison function, which we can pass to findIndex.

a = {x: 1};
b = {x: 2};
arr = [a, b];

Now we want to remove c, which is equal to, but not the same as a:

c = {x: 1}

index = arr.findIndex(
  (i) => i.x === c.x
)

if (index !== -1) {
  arr.splice(
    index, 1
  );
}    

Note that I'm passing an ES6 style lambda function here as the first parameter to findIndex.

Unless you have the luxury of only writing for evergreen browsers, you'll probably want to be using a transpiler like Babel to use this solution.

Solution with Immutability

If you care about immutability, and you want to return a new array, you can do it with filter:

a = {x: 1};
b = {x: 2};
arr = [a, b];

Let's keep everything that isn't a:

newArr = arr.filter((x) => x != a)

Upvotes: 41

Jimmy Obonyo Abor
Jimmy Obonyo Abor

Reputation: 7875

If you dont want to mutate your array simply use filter method , Array.prototype.filter()

array.filter((i)=> i != "b");

Upvotes: 3

xiaolu wang
xiaolu wang

Reputation: 1

function removeDuplicateObject (arr) {
  let temp = arr.map((item) => {
    return JSON.stringify(item);
  });
  temp = Array.from(new Set(temp));
  return temp.map((item) => {
    return JSON.parse(item);
  });
}

Then removeDuplicateObject(your array)

Upvotes: 0

Using ES6 approach:

const objIndex = objs.findIndex(o => o.value === '14' && o.label === '7')

if(objIndex > -1) {
  objs.slice(objIndex, 1)
}

Upvotes: 1

datchung
datchung

Reputation: 4622

Here is a way to do it without 'creating a new array' or using external libraries. Note that this will only remove the first instance found, not duplicates, as stated in your question's example.

// Array to search
var arr = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];

// Object to remove from arr
var remove = {"value":"14","label":"7"};

// Function to determine if two objects are equal by comparing
// their value and label properties
var isEqual = function(o1, o2) {
    return o1 === o2 || 
        (o1 != null && o2 != null && 
         o1.value === o2.value &&
         o1.label === o2.label);
};

// Iterate through array and determine if remove is in arr
var found = false;
var i;
for(i = 0; i < arr.length; ++i) {
    if(isEqual(arr[i], remove)) {
        found = true;
        break;
    }
}

if(found) {
    // Found remove in arr, remove it
    arr.splice(i, 1);
}

Demo

Upvotes: 1

Noah Freitas
Noah Freitas

Reputation: 17430

In ES6 (or using es6-shim) you can use Array.prototype.findIndex along with Array.prototype.splice:

arr.splice(arr.findIndex(matchesEl), 1);

function matchesEl(el) {
    return el.value === '14' && el.label === '7';
}

Or if a copy of the array is ok (and available since ES5), Array.prototype.filter's the way to go:

var withoutEl = arr.filter(function (el) { return !matchesEl(el); });

Upvotes: 92

Edgar Orozco
Edgar Orozco

Reputation: 2782

Try:

var ar = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}];

for(var i=0; i < ar.length; i++) {
   if(ar[i].value == "14" && ar[i].label == "7")
   {
      ar.splice(i,1);
   }
}

demo

Upvotes: 16

Kang
Kang

Reputation: 11

Do you need to keep the duplicate object?

With underscoreJS

var oldarray = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]
var newarray = _.reject(oldarray, function(o) { 
  return o == {"value":"14","label":"7"}; 
});

Upvotes: 0

user602271
user602271

Reputation:

I would create a new array...

var original = [{"value":"14","label":"7"},{"value":"14","label":"7"},{"value":"18","label":"7"}]

var result = [];

for (var i = 0, l = original.length; i < l; i++) { // Traverse the whole array
  var current = original[i];
  if (! (current.value == 14 && current.label == 7) ) {
    // It doesn't match the criteria, so add it to result
    result.push( current );
  }
}

Edit: I've read your question once more. You only want to remove the first element? Then use slice to get only a part of the array.

var result = original.slice(1, original.length)

or splice

original.splice(0,1); // Remove one element from index 0.

Upvotes: 1

Related Questions