web-dev-qa-db-fra.com

Est-il possible d'utiliser un type numérique comme clé d'objet?

Il semble que lorsque j'utilise un type numérique comme nom de clé dans un objet, il est toujours converti en chaîne. Est-il possible de le stocker en tant que valeur numérique? La classification normale ne semble pas fonctionner.

Exemple:

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

Dir Sortie:

{
    '1': 'a value'
}

Ce que je veux est-ce:

{
    1: 'a value'
}

Conseil?

Merci

63
Spot

Non, ce n'est pas possible. La clé sera toujours convertie en chaîne. Voir Docs de Property Accessor

Les noms de propriété doivent être des chaînes. Cela signifie que les objets non-chaîne ne peuvent pas être utilisés comme clés dans l'objet. Tout objet non-chaîne, y compris un nombre, est transtypé en chaîne via la méthode toString.

> var foo = {}
undefined

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

> foo
{ '23213': 'Swag' }

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

Dans un objet, non, mais j'ai trouvé Map extrêmement utile pour cette application. Voici où je l'ai utilisé pour les clés numériques, un événement basé sur une clé.

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

Il semblerait que ce soit le cas dans l'ECMA-262-5:

Le type d'identificateur de propriété est utilisé pour associer un nom de propriété à un descripteur de propriété. Les valeurs du type d'identifiant de propriété sont des paires de la forme (nom, descripteur), où nom est une chaîne et descripteur est une valeur de descripteur de propriété.

Cependant, je ne vois pas de spécification précise pour cela dans ECMA-262-3 . Quoi qu'il en soit, je ne tenterais pas d'utiliser des non-chaînes comme noms de propriété.

8
Rob Olmos

Avons-nous besoin de quelque chose comme ça?

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

Console: Objet

1:"a value "

1
Chittrang Mishra

Je pense que vous pouvez faire ce qui suit si vous voulez utiliser la chose ci-dessus pour y accéder comme un nombre, j'ai fait la même chose et j'ai travaillé.

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

Cela ne fonctionne que lorsque la touche ne commence pas par un caractère numérique, sinon elle sera convertie en nombre. Voir l'exemple suivant:

parseInt("45kjghk") === 45

J'ai utilisé jQuery ici


Mis à jour:

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
}

Cela peut résoudre le problème ci-dessus. S'il vous plaît suggérer mieux si disponible et problème avec cette réponse s'il y en a.

0
Shivam Sharma