Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript oddness with array of objects and indexOf

Not quite grasping what's going on here. Given the array (arr):

[
    {
        "first_name": "Dan",
        "last_name": "Woodson",
        "id": 1
    },
    {
        "first_name": "Jen",
        "last_name": "Woodson",
        "id": 2
    },
    {
        "first_name": "Yoshi",
        "last_name": "Woodson",
        "id": 3
    }
]

And the object (obj):

{
    "first_name": "Yoshi",
    "last_name": "Woodson",
    "id": 3
}

Why would arr.indexOf(obj) return -1 (especially since I retrieved the object from the array using it's 'id' parameter earlier in the function)?

like image 829
danwoods Avatar asked Dec 23 '11 16:12

danwoods


2 Answers

Array.indexOf() will only work on objects if the supplied object is exactly the same object you put in.

An exact copy is insufficient, it has to be the exact same object, i.e. there must be some object in the array such that:

arr[i] === obj

You need to show how you retrieved the object.

like image 82
Alnitak Avatar answered Sep 21 '22 07:09

Alnitak


I would like to see the retrieve function, but most likely you are not using the same reference. Because the following is true:

var a = {id: 3};
var b = [a];
b.indexOf(a); // 0
a.id = "not three";
b.indexOf(a); // still 0

However, the following will break:

var a = {id: 3};
var b = [{id: 3}];
b.indexOf(a); // -1 not the same object
like image 32
Joe Avatar answered Sep 22 '22 07:09

Joe