숫자 유형을 객체 키로 사용하는 방법이 있습니까?


102

객체의 키 이름으로 숫자 유형을 사용하면 항상 문자열로 변환되는 것 같습니다. 어쨌든 실제로 숫자로 저장할 수 있습니까? 정상적인 타입 캐스팅이 작동하지 않는 것 같습니다.

예:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

Dir 출력 :

{
    '1': 'a value'
}

내가 원하는 것은 다음과 같습니다.

{
    1: 'a value'
}

조언?


답변:


113

아니요, 불가능합니다. 키는 항상 문자열로 변환됩니다. 참조 속성 접근 자 문서를

속성 이름은 문자열이어야합니다. 즉, 문자열이 아닌 개체는 개체에서 키로 사용할 수 없습니다. 숫자를 포함한 문자열이 아닌 객체는 toString 메소드를 통해 문자열로 형변환됩니다.

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'

1
그것은 다소 주관적입니다. William이 언급했듯이 정수 키의 경우 대신 배열을 사용할 수 있습니다. 대부분의 JS 엔진은 배후에서 희소 배열을 사용할 수 있습니다.
Matthew Flaschen

8
배열에서도 모든 속성 이름은 문자열로 변환됩니다.
Tim Down

2
@ Roamer-1888 : 아니, 그렇지 않습니다. 유일한 차이점은 숫자 속성을 배열에 할당하면 배열의 length속성에 영향을 미친다는 것 입니다.
Tim Down

2
@ TimDown, 내가 말하는 것은 당신이 틀렸다는 것입니다. "배열에 숫자 속성을 설정하면 길이 속성에 영향을 줄 수 있습니다."는 잘못된 설명입니다. Javascript Array 속성은 Array 요소와 완전히 독립적입니다. 어떤 사람을 혼란스럽게하는 것은 예를 들면, 그 연관 구문 myArray["1"] = foo, 표시 실제로 배열 요소를 설정,하지만 "일"때문에 완전한 언어 말도 정수의 문자열 표현 인 반면, 속성을 설정하는 - 그러나 자바 스크립트의 그.
Roamer-1888

4
@ Roamer-1888 : "Javascript Array 속성은 Array 요소와 완전히 독립적입니다."는 잘못된 설명입니다. 속성을 설정하는 것처럼 보이는myArray["1"] = foo 것이 아니라 실제로 속성 정의의 모든 의미에서 속성 (키 "1"사용)을 설정하는 것입니다. 예, 수율 . 의미 적으로이 속성은 숫자 키가 있기 때문에 "요소"로 간주 될 수도 있지만 배열 "요소"와 배열 속성을 구별하는 것은 더 이상 없습니다. 사양을 읽으십시오. 그래도 동의하지 않으면 출처를 친절하게 인용하십시오. myArray.hasOwnProperty("1")true
Hans

26

개체에서는 아니요,하지만 이 응용 프로그램에 Map이 매우 유용하다는 것을 알았습니다 . 여기에서 키 기반 이벤트 인 숫자 키에 사용했습니다.

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}

1
우아한 Ludumdare 항목 101 ! +1
kaiser

11

ECMA-262-5에서 의도적으로 설계된 것처럼 보입니다.

속성 식별자 유형은 속성 이름을 속성 설명자와 연결하는 데 사용됩니다. 속성 식별자 유형의 값은 형식 (이름, 설명자)의 쌍입니다. 여기서 이름은 문자열이고 설명자는 속성 설명자 값입니다.

그러나 ECMA-262-3에는 이에 대한 명확한 사양이 없습니다. 그럼에도 불구하고 나는 속성 이름으로 비 문자열을 사용하지 않을 것입니다.


2

이런 게 필요한가요?

var userId = 1;var myObject ={};
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

콘솔 : 개체

1 : "값"


0

위의 것을 숫자처럼 접근하기 위해 사용하고 싶다면 다음과 같이 할 수 있다고 생각합니다.

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key))){
          return true; //continue;
     }
     //Code to perform operation
}

키가 숫자로 시작하지 않는 경우에만 작동합니다. 그렇지 않으면 숫자로 변환됩니다. 다음 예를 참조하십시오.

parseInt("45kjghk") === 45

여기서 jQuery를 사용했습니다.


업데이트 :

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key)) || (key.length !== parseInt(key).toString().length) ){
          return true; //continue;
     }
     //Code to perform operation
}

위의 문제를 극복 할 수 있습니다. 가능한 경우 더 나은 것을 제안하고 있으면이 답변에 문제가 있습니다.


-3

자바 스크립트에서 숫자 문자열과 숫자는 서로 바꿔 사용할 수 있으므로

myObject[1] == myObject['1']

정말로 숫자가 객체의 키가되기를 원한다면 배열을 원할 수 있습니다 (예 : new Array()또는로 생성됨 []).


2
답변 해 주셔서 감사합니다. 그러나 이것은 완전히 정확하지 않습니다. 숫자는 typeof에서 '숫자'로만 반환되며 그 반대의 경우 문자열로 반환됩니다.
스팟

@william '숫자 문자열과 숫자는 서로 바꿔 사용할 수 있습니다'는 단순히 정확하지 않습니다. 숫자는 숫자이고 문자열은 문자열입니다. 보다Object.prototype.toString.call(someObject)문제는 Numbers를 키로 사용할 수 없다는 것입니다.를 .
mikemaccana 2017 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.