Frage

Ich möchte ein assoziatives Array erstellen:

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

und ich möchte sicher sein, dass eine beliebige Taste, ich Zugriff auf eine Zahl sein wird:

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

Ich weiß, JS nicht Typisierung hat, so kann ich dies nicht automatisch überprüfen, aber ich kann in meinem eigenen Code sicherzustellen, dass ich nur Strings zuweisen zu diesem aa.

Jetzt Schlüssel vom Benutzer ich nehme. Ich möchte für diese Taste, um den Wert anzuzeigen. Wenn jedoch die Benutzer mir so etwas wie „toString“ gibt, wird er wieder eine Funktion, kein int! Gibt es eine Möglichkeit, um sicherzustellen, jede Saite er mir gibt, ist nur etwas, was ich definieren? Ist die einzige Lösung, so etwas wie:

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

etc ...

War es hilfreich?

Lösung

Wird diese Arbeit für Sie?

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

Update:

Mit Hilfe von Moss Collum und pottedmeat Ich empfehle diese generische Lösung:

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

Update2: Hat die „.call“ vergessen. (Dank pottedmeat dass für den Hinweis auf)

Update3: (über den Schlüssel)

Beachten Sie Folgendes: Der Schlüssel wird intern in eine Zeichenfolge konvertiert werden, da der Schlüssel tatsächlich ein Name eines Attributs ist.

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

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

Wenn versucht, ein Objekt zu verwenden:

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

Nun, da Sie wissen, dass es immer ein String ist, lässt es verwenden:

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

Andere Tipps

Eine Möglichkeit wäre hasOwnProperty zu verwenden um zu überprüfen, dass der Schlüssel ist etwas, das Sie explizit auf das Array hinzugefügt. Anstatt also:

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

Sie würde sagen:

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

Alternativ Sie typeof verwenden könnte um zu überprüfen, dass alles eine Nummer, bevor er zurückkehrt. Aber Ich mag den hasOwnProperty Ansatz, weil es Sie hält von etwas Rückkehr, die Sie nicht explizit in der Anordnung gelegt haben.

Wirklich einfache Antwort: Wenn Sie einen neuen Schlüssel prepend es mit einigem String-Konstante der eigenen erstellen.

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

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

function getkey(userstring)
{
  return a[k+userstring];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top