ti-enxame.com

Existe alguma maneira de usar um tipo numérico como uma chave de objeto?

Parece que quando eu uso um tipo numérico como um nome de chave em um objeto, ele sempre é convertido em uma string. Existe alguma maneira de realmente armazená-lo como numérico? O typecasting normal parece não funcionar.

Exemplo:

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

Saída Dir:

{
    '1': 'a value'
}

O que eu quero é isto:

{
    1: 'a value'
}

Conselhos?

Obrigado

63
Spot

Não, isso não é possível. A chave sempre será convertida em uma string. Veja Property Accessor docs

Nomes de propriedades devem ser strings. Isso significa que objetos não-string não podem ser usados ​​como chaves no objeto. Qualquer objeto não-string, incluindo um número, é typecasted em uma string através do método toString.

> var foo = {}
undefined

> foo[23213] = 'Swag'
'Swag'

> foo
{ '23213': 'Swag' }

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

Em um objeto, não, mas eu encontrei Map extremamente útil para esta aplicação. Aqui é onde eu usei para chaves numéricas, um evento baseado em chave.

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)();
  }
}
14
corvid

Parece ser por design na ECMA-262-5:

O tipo Identificador de Propriedade é usado para associar um nome de propriedade a um Descritor de Propriedade. Valores do tipo Identificador de Propriedade são pares da forma (nome, descritor), onde o nome é uma String e o descritor é um valor do Descritor da Propriedade.

No entanto, eu não vejo uma especificação definitiva para ele no ECMA-262-3. Independentemente disso, eu não tentaria usar non-strings como nomes de propriedade.

8
Rob Olmos

Precisamos de algo assim?

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

Console: Objeto

1 : "Um valor"

1
Chittrang Mishra

Eu acho que você pode fazer o seguinte se você quiser usar a coisa acima para acessá-lo como um número, eu fiz o mesmo e trabalhei.

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

Isso funciona somente quando a chave não inicia e o caractere numérico será convertido em um número. Veja o seguinte exemplo:

parseInt("45kjghk") === 45

Eu usei o jQuery aqui


Atualizada:

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
}

Pode superar o problema acima. Por favor sugira melhor se disponível e problema com esta resposta se houver.

0
Shivam Sharma