JavaScript의 연관 배열에서 정수를 키로 사용


102

새 JavaScript 배열을 만들고 정수를 키로 사용하면 해당 배열의 각 요소가 정의되지 않은 것으로 생성됩니다.

예를 들면 :

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

정의되지 않은 2298 개와 '일부 문자열'하나를 출력합니다.

정수 대신 문자열로 2300을 사용하도록 JavaScript를 가져 오거나 2299 빈 인덱스를 인스턴스화하지 않도록하려면 어떻게해야합니까?

답변:


128

사람들이 말하는 것처럼 물건을 사용하십시오. 그러나 정수 키는 가질 수 없습니다 . JavaScript는 정수를 문자열로 변환합니다 . 다음은 정의되지 않은 20을 출력합니다.

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

12
+1 이것은 배열에서도 마찬가지입니다! stackoverflow.com/questions/1450957/…
bobince

1
@bobince : 내부적으로는 물론입니다. 그러나 논리적으로 배열에는 정수 "키"가 있습니다.
궤도의 가벼운 경주

1
정수를 키로 사용하면 배열 길이가 변경됩니다. 대신 Object를 사용해야합니다. 난 그냥 키로 페이스 북 ID를 사용 원했고, JSON.stringify 내 컴퓨터를 충돌 것)
크리스티안

2
@LightnessRacesinOrbit 내부 세부 사항은 여전히 ​​누출되어 당신을 물릴 수 있습니다. 내가 오늘 만난 이 단순화 된 버전을 참조하십시오 : jsfiddle.net/cincodenada/pseujLex/2 축소하면 인위적으로 보일 수 있지만 더 큰 스크립트의 감각적 인 부분이었습니다 (커피 스크립트에서는 조금 덜 인위적입니다 : jsfiddle.net/). cincodenada / oojr7Ltn / 2 ). 이처럼 보이는 구현 세부 사항은 오늘 버그 사냥에 많은 비용이 듭니다.
cincodenada

1
: 약간의 비 정수에 대한주의 0.25.25같은 문자열로 해결 "0.25". 따라서 분수 키를 0.25사용하는 0.25경우 .25,를 사용하여 숫자로 설정된 키의 속성을 검색 할 수 "0.25"있지만 ".25".
Sandy Gifford 2015 년

34

객체를 사용할 수 있습니다.

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

16
여전히 문자열로 캐스팅됩니다.
drew010 2016

1
@ drew010 예, Javascript의 객체는 문자열로만 인덱싱을 허용합니다.
Pithikos

22

사람들이 말했듯이 JavaScript는 숫자 문자열을 정수로 변환하므로 연관 배열에서 직접 사용할 수는 없지만 객체는 제 생각과 비슷한 방식으로 작동합니다.

다음과 같이 개체를 만들 수 있습니다.

var object = {};

그리고 배열이 작동 할 때 값을 추가합니다.

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

이것은 당신에게 줄 것입니다 :

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

그 후에 다른 언어의 배열처럼 키를 가져 오는 것처럼 액세스 할 수 있습니다.

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

나는 테스트하고 작동합니다.


17

사용 사례가 컬렉션에 데이터를 저장하는 경우 ECMAScript 6Map유형을 제공합니다 .

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

다음은 예입니다.

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)

11

다른 답변 컴파일 :

목적

var test = {};

숫자를 새 속성의 키로 사용하면 숫자가 문자열로 바뀝니다.

test[2300] = 'Some string';
console.log(test['2300']);
// Output: 'Some string'

동일한 숫자를 사용하여 속성 값에 액세스하면 숫자가 다시 문자열로 바뀝니다.

console.log(test[2300]);
// Output: 'Some string'

그러나 객체에서 키를 가져올 때 숫자로 다시 변환되지는 않습니다.

for (var key in test) {
    console.log(typeof key);
}
// Output: 'string'

지도

ECMAScript 6에서는 Map 객체 ( documentation , Object와의 비교 )를 사용할 수 있습니다. 코드가 로컬에서 해석되거나 ECMAScript 6 호환성 테이블 이 목적에 맞게 충분히 녹색으로 보이는 경우 맵 사용을 고려하십시오.

var test = new Map();
test.set(2300, 'Some string');
console.log(test.get(2300));
// Output: 'Some string'

좋든 나쁘 든 유형 변환이 수행되지 않습니다.

console.log(test.get('2300'));
// Output: undefined
test.set('2300', 'Very different string');
console.log(test.get(2300));
// Output: 'Some string'

4

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

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

1
그들은 수있는 연관 배열 할 수 있지만 속성을 설정라는 이름의 한 수있는 개체도 만하기 때문이다. 그러나 이것은 일을 엄청나게 혼란스럽게 만들고 그렇습니다. 객체를 사용하는 것이 훨씬 좋습니다.
Graza 2010 년

배열은 연관 Graza가 될 수 없습니다. 배열에서 키를 사용하려고 시도한 다음이를 반복하면 배열의 모든 기본 메서드와 속성을 반복하고 있음을 알 수 있습니다.-> 그다지 바람직하지 않습니다.
Swizec Teller

@Swizec-정확히 내가 "어리석게 혼란스러워"라고 말한 이유. 배열을 연관 배열로 사용할 수 있습니다. 즉, 이름 / 값 쌍으로 사용할 수 있지만 절대 반복하고 싶지 않습니다! (나는 단순히 기술적 인 부분을 지적하고 있었는데, 확실히 내가 권장하는 것은 전혀 아닙니다)
Graza

예,하지만 반복 할 때 특정 순서가 아닙니다 (즉, 순서가 보장되지 않음). 이는 번호를 매기는 요점이므로 혼란스러워하는 것보다 훨씬 더 나쁩니다.
Julix

3

배열이 아닌 객체를 사용해보십시오.

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

3
이것은 확실히 갈 길이다. 이렇게하면 단일 문자열을 저장하기 위해 2300 개의 항목 긴 배열을 만들지 않습니다.
Krystian

2
@Krystian JS 배열은 가짜 배열입니다. 실행 var a = []; a[Math.pow(2, 30)] = 'hello';하면 브라우저 / 메모리 사용량이 기가 바이트 이상 증가하는 것을 볼 수 없지만 a.length1073741824는 1073741824입니다. VM은 다른 데이터 구조를 사용하여 일부 "배열"을 명확하게 저장합니다. 충분히 희박합니다.
Andy

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

보시다시피 연관 배열 제한을 피하고 속성 이름을 정수로 지정할 수 있습니다.

참고 :이 예제의 연관 배열은 Dictionary <string, string> [] 개체를 직렬화 한 경우에 갖게되는 JSON 콘텐츠입니다.



0

때로는 키에 접두사를 사용합니다. 예를 들면 :

var pre = 'foo',
    key = pre + 1234

obj = {};

obj[key] = val;

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.