아래의 객체 리터럴을 검색 할 때 색인 -1을 얻지 만 그 이유는 알 수 없습니다.indexOf 배열의 객체를 찾을 수없는 이유
개체 리터럴과 같은 복합 형식을 사용하여 배열에서이 개체를 검색 할 수 있습니까?
var fruits = [{name: "Banana"}, {name: "Orange"}];
var index = fruits.indexOf({name: "Banana"});
아래의 객체 리터럴을 검색 할 때 색인 -1을 얻지 만 그 이유는 알 수 없습니다.indexOf 배열의 객체를 찾을 수없는 이유
개체 리터럴과 같은 복합 형식을 사용하여 배열에서이 개체를 검색 할 수 있습니까?
var fruits = [{name: "Banana"}, {name: "Orange"}];
var index = fruits.indexOf({name: "Banana"});
-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,
foo
는 bar
가 아닌 다른 개체입니다. 그들은 단지 같은 속성을 가지고 있습니다. 그러나 그들은 메모리에서 다른 위치를 차지합니다. 또는 다른 말로하면 foo
을 수정하면 bar
이 변경되지 않습니다.
라이브러리가 많기 때문에 "deep equals"문제가 해결되었으므로 jQuery 나 Underscore 등을 사용하는 경우 여기를 확인하십시오. 그렇지 않으면 몇 가지 문제가 있기 때문에 구현 방법을 찾아보십시오.
다차원 배열, 난 당신이 뭔가를 사용할 수 있습니다, 당신은 그러나, 이러한 간단한 방법으로 같이 IndexOf를 사용할 수 있다고 생각하지 않습니다
for(var i = 0; i < fruits.length; i++) {
if(fruits[i].name === 'Banana') {
return i;
}
}
객체는 여기에, 어떤 간단한 방법으로 비교할 수 없습니다 관련 게시물입니다 : http://stackoverflow.com/questions/1068834/object-comparison-in-javascript – orhanhenrik
실제 문제에 대한 유용한 솔루션 http://stackoverflow.com/questions/237104/array-containsobj-in- javadript – apsillers
짧은 대답 :'{name : "Banana"} === {name : "Banana"}'가 거짓이기 때문에. –