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 ...

Foi útil?

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];
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top