2010-01-04 5 views
70

새 자바 스크립트 배열을 만들고 정수를 키로 사용하면 정수까지 배열의 각 요소가 정의되지 않은 것으로 만들어집니다. 예를 들어 :Javascript : 연관 배열에서 정수를 키로 사용 하시겠습니까?

var test = new Array(); 
test[2300] = 'Some string'; 
console.log(test); 

가 출력 2298 정의되지 않은 및 하나의 '일부 문자열'.

자바 스크립트에서 2300을 정수 대신 문자열로 사용하려면 어떻게해야합니까? 아니면 2299 빈 인덱스를 인스턴스화하지 않고 어떻게 보관해야합니까?

답변

27

당신은 단지 객체를 사용할 수 있습니다

var test = {} 
test[2300] = 'Some string'; 
+5

은 여전히 ​​문자열로 캐스팅됩니다 여기

은 예입니다. – drew010

2

이 객체를 사용하여 시도하지 배열 :

var test = new Object(); test[2300] = 'Some string'; 
+2

이것은 확실히가는 길입니다. 이렇게하면 단일 문자열을 저장하기 위해 2300 개의 long 배열을 만들지 않습니다. – Krystian

+0

@Krystian JS 배열은 가짜 배열입니다. 'var a = [];를 실행하십시오. [Math.pow (2, 30)] = 'hello';'브라우저/메모리 사용량이 기가 바이트 이상으로 늘어나는 것을 보지 못 하겠지만'a.length'는 1073741824입니다. 일부 다른 데이터 구조를 사용하는 일부 "배열"은 최소한 해시 테이블을 충분히 추측합니다. – Andy

2

를 사용하여 객체 대신 배열. JavaScript의 배열은 연관 배열이 아닙니다. 이름이 정수처럼 보이는 모든 속성과 관련된 마법이있는 객체입니다. 그 마법은 전통적인 배열과 같은 구조로 사용하지 않는다면 원하는 것이 아닙니다.

var test = {}; 
test[2300] = 'some string'; 
console.log(test); 
+1

그들은 * 연관 배열 일 수도 있지만 명명 된 속성 집합을 가질 수있는 객체이기도합니다. 하지만 이렇게하면 일이 어리석게 혼란스럽고, 그렇습니다. 물건을 사용하는 것이 훨씬 낫습니다. – Graza

+0

배열은 결코 연관성있는 Graza가 될 수 없습니다. 배열에서 키를 사용하려고 시도한 다음 반복 할 경우 배열의 모든 기본 메서드와 속성을 반복하면서 알 수 있습니다. –

+0

@Swizec - 정확하게 말하면서 "말도 안되는 혼란". 배열을 연관 배열로 사용할 수 있습니다 - 이름/값 쌍과 같지만 반복 할 필요가 없습니다! (나는 단지 전문성을 지적하고 있었고, 분명히 내가하는 모든 일을 권하고 싶지 않았다.) – Graza

0

배열이 아닌 정수를 개체로 사용하십시오.

105

사람들이 말하는 것처럼 개체를 사용하십시오. 그러나 은 아니며에는 정수 키가 있습니다. JavaScript 은 정수를 문자열으로 변환합니다.

var test = {} 
test[2300] = 20; 
console.log(test["2300"]); 
+10

+1 이것은 배열의 경우에도 마찬가지입니다. http://stackoverflow.com/questions/1450957/pythons-json-module-converts-int-dictionary-keys-to-strings#1450981 – bobince

+0

좋은 지적! 나는 그것에 대해 잊어 버렸다. – Claudiu

+1

@bobince : 내부적으로, 확실합니다. 그러나 _logically_, 배열에는 정수 "키"가 있습니다. –

18

사람들이 자바 스크립트 그렇게 연관 배열에서 직접 사용할 수 없습니다 정수로 숫자의 문자열을 변환합니다 말하는 것처럼하지만, 객체 내 생각은 비슷한 방식으로 당신을 위해 작동합니다 : 다음 출력 (20)는, 정의되지 않은하지 .

var object = {}; 

및 배열 작품으로 값을 추가합니다 :

당신은 당신의 개체를 만들 수 있습니다

object[1] = value; 
object[2] = value; 

이 당신에게 줄 것이다 :

{ 
    '1':value, 
    '2':value 
} 

을 당신이 그것을 액세스 할 수 있습니다 그 후 키를 가져 오는 다른 언어의 배열 :

for(key in object) 
{ 
    value = object[key] ; 
} 

유용한 정보입니다. 나는 시험하고 일했다.

2

속성 이름은 정수 때 연관 배열 속성 값을 가져옵니다 : 배열에

var categories = [ 
    {"1":"Category 1"}, 
    {"2":"Category 2"}, 
    {"3":"Category 3"}, 
    {"4":"Category 4"} 
]; 

푸시 항목 : 속성 이름은 정수 연관 배열로 시작

categories.push({"2300": "Category 2300"}); 
categories.push({"2301": "Category 2301"}); 

루프를 통해 배열을 속성 값으로 처리하십시오.

for (var i = 0; i < categories.length; i++) { 
    for (var categoryid in categories[i]) { 
     var category = categories[i][categoryid]; 
     // log progress to the console 
     console.log(categoryid + " : " + category); 
     // ... do something 
    } 
} 

콘솔 출력은, 다음과 같이

1 : Category 1 
2 : Category 2 
3 : Category 3 
4 : Category 4 
2300 : Category 2300 
2301 : Category 2301 

당신이 볼 수 있듯이, 당신은 연관 배열의 한계 극복 및 속성 이름은 정수가 될 수 있습니다.

참고 : 제 예제의 연관 배열은 [] 객체 인 < 문자열을 일련 번호로 serialize하면 json이됩니다.

1

가끔 키에 접두사를 사용합니다. 예 :

이제 액세스하는 데 문제가 없습니다.

4

유스 케이스가 데이터를 콜렉션에 저장하는 경우 ES6Map 유형을 제공합니다.

초기화하는 것이 더 무겁습니다.

const map = new Map(); 
map.set(1, "One"); 
map.set(2, "Two"); 
map.set(3, "Three"); 

console.log("=== With Map ==="); 

for (const [key, value] of map) { 
    console.log(`${key}: ${value} (${typeof(key)})`); 
} 

console.log("=== With Object ==="); 

const fakeMap = { 
    1: "One", 
    2: "Two", 
    3: "Three" 
}; 

for (const key in fakeMap) { 
    console.log(`${key}: ${fakeMap[key]} (${typeof(key)})`); 
} 

결과 :

=== With Map === 
1: One (number) 
2: Two (number) 
3: Three (number) 
=== With Object === 
1: One (string) 
2: Two (string) 
3: Three (string) 
관련 문제