2010-11-21 3 views
0

는이 같은 배열이 있습니다JS & jQuery : 인덱스가 문자열 인 경우 inArray() 및 indexOf()가 제대로 작동하지 않습니다?

var arr = []; 
arr['A string'] = '123'; 
arr['Another string'] = '456'; 

및 임 '123'또는 '456'의 인덱스를 찾기 위해 노력.

모두 :

var string = $.inArray('123', arr) 

var string = arr.indexOf('123') 

나를주고있다 -1. 인덱스가 문자열 일 때 작동하도록 할 수 있습니까?

+0

문자열을 표시로 사용하는 경우 배열이 객체입니다. –

답변

3

JavaScript 배열을 연관 배열로 사용하는 것은 문제가 있습니다 (something that it is not). JavaScript 배열의 인덱스는 부호없는 32 비트 정수이므로 * 문자열 **을 사용할 수 없습니다. 당신은 너무

// I'm guessing that you meant to give numerical and not string values 
var arr = [123, 456]; 

같은 배열을 사용하거나 개체를 사용하여, 'A string''Another string' 객체 obj의 속성이라는 것을 객체를

var obj = { 
    'A string' : 123, 
    'Another string' : 456 
}; 

주를 사용하여 값처럼 인덱싱 할 수없는 것 중 하나 배열. 당신은 객체 속성을 문자열이 문자열이 아닌 다른이 in 키워드

if ('A string' in obj) { 
    // if obj has a property 'A string' as a property (could be an inherited property too) 
} 

**를 사용하는 것입니다 hasOwnProperty

if (obj.hasOwnProperty('A string')) { 
    // if obj has property 'A string' as a direct property 
} 

을 사용하는 것 중 하나가 방법의 번호를 가지고 있음을 확인할 수 있습니다 표현의 32 비트 부호없는 정수는 Tim으로 지적하지만 많은 자바 스크립트 개발자는 정수를 사용하여 명확성을 강조한다고 말하기는 어렵다고 생각합니다. *

3

모든 배열 메소드와 마찬가지로속성의 경우 Array 개체의 indexOf 메서드는 Array의 숫자 속성 만 고려합니다. 이것들은 이름이 부호없는 정수인 속성입니다. 특정 값을 가진 속성의 존재 여부를 테스트하려면 배열을 비롯한 모든 객체에서 이와 같은 작업을 수행 할 수 있습니다. 이 속성 이름의 열거 순서에 대한 보장은 없다, 그래서 특정 값으로 하나 개 이상의 특성이 있다면 당신은 당신이 얻을 것이다 어떤 속성이 확신 할 수 없다 :

function findPropertyWithValue(obj, val) { 
    for (var i in obj) { 
     if (obj.hasOwnProperty(i) && obj[i] === val) { 
      return i; 
     } 
    } 
    return null; 
} 

var arr = []; 
arr['A string'] = '123'; 
arr['Another string'] = '456'; 
alert(findPropertyWithValue(arr, "123")); // 'A string' 

참고 모든 속성 이름부터, 문자열을 사용하여 배열 속성을 할당 할 수 있습니다.

var arr = []; 
arr["1"] = "foo"; 
arr[3] = "bar" 
arr.indexOf("foo"); // 1 
arr.indexOf("bar"); // 3 
+0

완벽한 솔루션입니다. 감사! – sNiCKY

관련 문제