matriz associativa sem toString, etc.
-
21-08-2019 - |
Pergunta
Eu quero criar uma matriz associativa:
var aa = {} //equivalent to Object(), new Object(), etc...
e eu quero ter certeza de que qualquer chave de acesso que vai ser um número:
aa['hey'] = 4.3;
aa['btar'] = 43.1;
Eu sei que JS não tem digitação, por isso não posso verificar automaticamente isso, mas posso garantir que no meu próprio código que eu só cordas atribuir a este aa.
Agora eu estou tomando as chaves do usuário. Eu quero mostrar o valor para essa chave. No entanto, se o usuário dá-me algo como "toString", ele vai voltar uma função, não um int! Existe alguma maneira para se certificar de qualquer cadeia, ele dá-me só uma coisa que eu definir? É a única solução algo como:
delete aa['toString'];
delete aa['hasOwnProperty'];
etc ...
Solução
Será que este trabalho para você?
function getValue(id){
return (!isNaN(aa[id])) ? aa[id] : undefined;
}
Update:
Com a ajuda de Moss Collum e pottedmeat Eu recomendo esta solução genérica:
function getValue(hash,key) {
return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined;
}
Update2: Teve esqueceu o ".Call". (Graças pottedmeat por apontar isso)
Update3: (Sobre a tecla)
Observe o seguinte: A chave será internamente ser convertido para uma cadeia porque a chave é realmente um nome de um atributo.
var test = {
2:"Defined as numeric",
"2":"Defined as string"
}
alert(test[2]); //Alerts "Defined as string"
Se tentar usar um objeto:
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".
Agora que você sabe que é sempre uma string, vamos usá-lo:
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".
Outras dicas
Uma possibilidade seria usar hasOwnProperty para verificar que a chave é algo que você adicionado explicitamente à matriz. Assim em vez de:
function findNumber(userEnteredKey) {
return aa[userEnteredKey];
}
Você diria:
function findNumber(userEnteredKey) {
if (Object.prototype.hasOwnProperty.call(aa,userEnteredKey))
return aa[userEnteredKey];
}
Como alternativa, você poderia usar typeof para verificar que tudo é um número antes de devolvê-lo. Mas eu, como a abordagem hasOwnProperty, porque ele vai mantê-lo de retornar qualquer coisa que você não intencionalmente colocar na matriz.
resposta muito simples: quando você cria uma nova chave preceder-lo com alguma constante seqüência de seu próprio país.
var a = {};
var k = 'MYAPP.COLLECTIONFOO.KEY.';
function setkey(userstring)
{
a[k+userstring] = 42;
}
function getkey(userstring)
{
return a[k+userstring];
}