Question

Je veux créer un tableau associatif:

var aa = {} //equivalent to Object(), new Object(), etc...

et je veux être sûr que toute touche je avoir accès va être un numéro:

aa['hey'] = 4.3;
aa['btar'] = 43.1;

Je sais que JS ne lui assigne pas taper, donc je ne peux pas vérifier automatiquement, mais je peux assurer dans mon code que je ne les chaînes à cette aa.

Maintenant, je vais prendre les clés de l'utilisateur. Je veux afficher la valeur de cette clé. Cependant, si l'utilisateur me donne quelque chose comme « toString », il va se remettre d'une fonction, pas un int! Est-il possible de se assurer une chaîne qu'il me donne est quelque chose que je ne définiriez-vous? Est-ce la seule solution quelque chose comme:

delete aa['toString'];
delete aa['hasOwnProperty'];

etc ...

Était-ce utile?

La solution

Est-ce que ce travail pour vous?

function getValue(id){
  return (!isNaN(aa[id])) ? aa[id] : undefined;
}

Mise à jour:

Avec l'aide de Moss Collum et pottedmeat Je recommande cette solution générique:

function getValue(hash,key) {
    return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined;
}

Update2: Avait oublié le « .call ». (Grâce pottedmeat pour cette remarque)

Update3: (A propos de la clé)

Notez ce qui suit: La clé sera convertie en interne à une chaîne parce que la clé est en fait le nom d'un attribut.

var test = {
  2:"Defined as numeric", 
  "2":"Defined as string" 
}  

alert(test[2]); //Alerts "Defined as string"

Si vous essayez d'utiliser un objet:

var test={}, test2={};
test[test2]="message"; //Using an object as a key.

alert(test[test2]); //Alerts "message". Looks like it works...

alert(test[  test2.toString() ]);
//If it really was an object this would not have worked,
// but it also alerts "message".

Maintenant que vous savez qu'il est toujours une chaîne, permet de l'utiliser:

var test={};

var test2={
    toString:function(){return "some_unique_value";}
    //Note that the attribute name (toString) don't need quotes.
}

test[test2]="message";
alert(test[ "some_unique_value"] ); //Alerts "message".

Autres conseils

Une possibilité serait d'utiliser hasOwnProperty pour vérifier que la clé est quelque chose que vous explicitement ajouté au tableau. Ainsi, au lieu de:

function findNumber(userEnteredKey) {
    return aa[userEnteredKey];
}

vous dirais:

function findNumber(userEnteredKey) {
    if (Object.prototype.hasOwnProperty.call(aa,userEnteredKey))
        return aa[userEnteredKey];
}

Alternativement, vous pouvez utiliser typeof pour vérifier que tout est un numéro avant de le retourner. Mais j'aime l'approche hasOwnProperty, parce que ça va vous garder de tout retour que vous ne l'avez pas mis intentionnellement dans le tableau.

Vraiment simple réponse: lorsque vous créez une nouvelle clé précédez avec une constante de chaîne de votre propre.

var a = {};
var k = 'MYAPP.COLLECTIONFOO.KEY.';

function setkey(userstring)
{
  a[k+userstring] = 42;
}

function getkey(userstring)
{
  return a[k+userstring];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top