2013-06-24 14 views
2
var myWidth = 20; 
var myHeight = 30; 

allDims = [ 
    {w: 20, h: 30}, 
    {w: 10, h: 15} 
] 

if ($.inArray({w: myWidth, h: myHeight}, allDims) !== -1) { 
    ... 
} 

if 조건이 항상 -1을 반환하는 이유는 무엇입니까?

+4

그것은 항상 -1 하나의 객체들이 동일한 데이터를 포함하는 경우에도, 다른 객체에 결코 동일하기 때문이다. 이 규칙에 대한 유일한 예외는 배열에 저장된 객체가 참조로 저장되고 테스트하려는 객체가 동일한 객체에 대한 참조 일 때입니다. 이 경우 문자 그대로 같은 대상이됩니다. –

답변

4

개체의 평등 테스트가 참조 평등을 기반으로하기 때문에이 방법은 작동하지 않습니다. the MDN에서

:

두 별개의 객체는 그래서 당신은 인덱스 루핑 및 wh 둘을 비교하여 자신을 검색 구현해야 하나 엄격 또는 추상 비교

평등 한 적이 없습니다. 예를 들어

: 당신이 더 우아한 무언가를 원하는 경우에

   var index = -1; 
   for (var i=0; i<allDims.length; i++) { 
     if (allDims[i].w==myWidth && allDims[i].h==myHeight) { 
      index = i; 
      break; 
     } 
    } 

, 당신은 filter를 사용하는 함수를 통과하지만, 필요하지 않은 경우에도 전체 배열을 반복 할 수 있습니다. 평등을 확인하는 콜백을 복용하는 일반적인 indexOf와 유사한 기능을하지만 설계 할 수 있습니다

Array.prototype.indexFunc = function(o, equal) { 
    for (var i=0; i<this.length; i++) { 
    if (equal(o,this[i])) return i; 
    } 
    return -1; 
} 
console.log(allDims.indexFunc({w:10, h:15}, function(a,b) { 
     return a.w==b.w && a.h==b.h 
})); // logs 1 
+1

이 답변은 하향 투표를받을 자격이 없으며 100 % 정확합니다. 다른 (현재) 대답은 upvotes 자격이되지 않습니다 - 그것은 100 % 올바르지 않습니다. – Alnitak

관련 문제