Pregunta

Quiero crear una matriz asociativa:

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

y yo quiero estar seguro de que cualquier tecla accedo va a ser un número:

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

Yo sé JS no tiene escribir, así que no puedo comprobar automáticamente esto, pero puedo asegurar que en mi propio código que sólo asigno cuerdas a este AA.

Ahora estoy tomando las llaves de usuario. Quiero mostrar el valor de esa tecla. Sin embargo, si el usuario me da algo así como "toString", que va a volver a una función, no un int! ¿Hay alguna manera para asegurarse de que cualquier cadena que me da es solamente algo defino? Es la única solución algo como:

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

etc ...

¿Fue útil?

Solución

¿Funcionará para usted?

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

Actualización:

Con la ayuda de Musgo Collum y pottedmeat Me recomiendan esta solución genérica:

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

Actualización 2: Había olvidado el ".call". (Gracias pottedmeat por señalarlo)

Update3: (Acerca de la tecla)

Tenga en cuenta lo siguiente: La clave será internamente se convierte en una cadena porque la clave es en realidad un nombre de un atributo.

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

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

Si intenta utilizar un 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".

Ahora que ya sabe que siempre es una cadena, permite utilizarlo:

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

Otros consejos

Una posibilidad sería utilizar hasOwnProperty para comprobar que la clave es algo que ha añadido explícitamente a la matriz. Así que en lugar de:

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

que diría:

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

Como alternativa, se puede usar typeof para comprobar que todo es un número antes de devolverlo. Pero me gusta el enfoque hasOwnProperty, porque él se puede mantener de volver cualquier cosa que usted no puso intencionalmente en la matriz.

respuesta muy simple: cuando se crea una nueva clave anteponer con un poco de cadena constante de su propia.

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

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

function getkey(userstring)
{
  return a[k+userstring];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top