2014-10-12 5 views
1

아래의 객체 리터럴을 검색 할 때 색인 -1을 얻지 만 그 이유는 알 수 없습니다.indexOf 배열의 객체를 찾을 수없는 이유

개체 리터럴과 같은 복합 형식을 사용하여 배열에서이 개체를 검색 할 수 있습니까?

var fruits = [{name: "Banana"}, {name: "Orange"}]; 
var index = fruits.indexOf({name: "Banana"}); 
+2

객체는 여기에, 어떤 간단한 방법으로 비교할 수 없습니다 관련 게시물입니다 : http://stackoverflow.com/questions/1068834/object-comparison-in-javascript – orhanhenrik

+0

실제 문제에 대한 유용한 솔루션 http://stackoverflow.com/questions/237104/array-containsobj-in- javadript – apsillers

+1

짧은 대답 :'{name : "Banana"} === {name : "Banana"}'가 거짓이기 때문에. –

답변

1

-1{name: "Banana"} 배열에서 발견되지 않은 것을 의미한다. 첫 번째 {name: "Banana"}은 두 번째 {name: "Banana"}과 다른 개체이기 때문입니다.

원시 유형을 검색하는 경우 예상대로 작동합니다. 그러나 객체를 사용하면 실제 객체가 동일한 값 (즉, 메모리의 동일한 위치)이면서 동일한 값을 갖는 것은 아니라는 것을 알 수 있습니다. 그래서

:

[0,1,2,3].indexOf(3);  // 3, no surprise 

var foo = {name: "Banana"}; 
[foo].indexOf(foo);  // 0, no surprise 

var bar = {name: "Banana"}; 
[foo].indexOf({name: "Banana"}); // -1, here's your wtf moment, 

foobar가 아닌 다른 개체입니다. 그들은 단지 같은 속성을 가지고 있습니다. 그러나 그들은 메모리에서 다른 위치를 차지합니다. 또는 다른 말로하면 foo을 수정하면 bar이 변경되지 않습니다.

라이브러리가 많기 때문에 "deep equals"문제가 해결되었으므로 jQuery 나 Underscore 등을 사용하는 경우 여기를 확인하십시오. 그렇지 않으면 몇 가지 문제가 있기 때문에 구현 방법을 찾아보십시오.

다차원 배열
+0

어떤 명령으로 밑줄 친 것이 있습니까? – dandavis

+0

@dandavis'isEqual()'http://underscorejs.org/#isEqual – Trott

1

, 난 당신이 뭔가를 사용할 수 있습니다, 당신은 그러나, 이러한 간단한 방법으로 같이 IndexOf를 사용할 수 있다고 생각하지 않습니다

for(var i = 0; i < fruits.length; i++) { 
    if(fruits[i].name === 'Banana') { 
    return i; 
    } 
} 
관련 문제