'How to get index of object in array of objects and splice it?

I'm using angular 1.3, but his question maybe related only to javascript.

My candidates array:

var candidates = [
  { "attr1": "lu", "attr2": "pizza" },
  { "attr1": "gina", "attr2": "sushi" },
  { "attr1": "hed", "attr2": "hummus" }
];

My peoples array:

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

And i've some checkbox too:

<div class="checkbox" ng-repeat="d in candidates ">
<label>
<input name="d[]" type="checkbox"ng-click="addRemove(d)" ng-value="d">
 {{d.attr1}}
</label>

So i've a function that toggles an item (from candidates) and I want to add or remove (if already exists)

 $scope.addRemove = function (item) {      
            var idx = peoples.indexOf(item);
            if (idx > -1) {             
                peoples.splice(idx, 1);
            }
            else {
                peoples.push(item);
            }         
        };

For some reason, if (idx > -1) its never true and it keeps add items even if they already exists.



Solution 1:[1]

indexOf will not compare object by value instead, it compare object by reference. You can do the following .

(Sorry updated my answer to get the "idx" and not if it exists )

You can do this :

var idx = peoples.map(function(p){ return p.attr2;}).indexOf(item.attr2);

if (idx) {             
            peoples.splice(idx, 1);
        }
        else {
            peoples.push(item);
        }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1