2011-12-23 27 views
8

Không hoàn toàn nắm bắt những gì đang xảy ra ở đây. Với mảng (arr):Sự kỳ quặc Javascript với mảng đối tượng và indexOf

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

Và đối tượng (obj):

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

Tại sao arr.indexOf(obj) trở -1 (đặc biệt là kể từ khi tôi lấy đối tượng từ mảng sử dụng nó là 'id' tham số trước trong chức năng)?

+0

Ý anh là gì "Trước đó trong chức năng"? Bạn cần hiển thị cho chúng tôi mã mà bạn đã viết không thành công, không chỉ một số JSON. – Incognito

+0

Bạn có thể đăng mã thực tế bạn đang sử dụng và/hoặc đặt nó trên fsFiddle không? – jefflunt

+4

Điều này là do '({a: 12}) === ({a: 12})' là 'sai'. Các đối tượng trong JavaScript bằng nhau nếu chúng là cùng một đối tượng (cùng một tham chiếu), không chỉ các giá trị giống nhau. –

Trả lời

5

Array.indexOf() sẽ chỉ hoạt động trên các đối tượng nếu đối tượng được cung cấp là chính xác cùng một đối tượng mà bạn đặt trong.

Một chính xác bản sao là không đủ, nó phải là chính xác cùng một đối tượng, tức là phải có một số đối tượng trong mảng như vậy:

arr[i] === obj 

Bạn cần phải chứng minh làm thế nào bạn lấy các vật.

1

Tôi muốn xem hàm truy xuất, nhưng rất có thể bạn không sử dụng cùng một tham chiếu. Bởi vì sau đây là đúng:

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

Tuy nhiên, sau đây sẽ phá vỡ:

var a = {id: 3}; 
var b = [{id: 3}]; 
b.indexOf(a); // -1 not the same object 
Các vấn đề liên quan