I want to create an associative array:
var aa = {} // Equivalent to Object(), new Object(), etc...
And I want to be sure that any key I access is going to be a number:
aa['hey'] = 4.3;
aa['btar'] = 43.1;
I know JavaScript doesn't have typing, so I can't automatically check this, but I can ensure in my own code that I only assign strings to this aa.
Now I'm taking keys from the user. I want to display the value for that key. However, if the user gives me something like "toString", the user gets back a function, not an int! Is there a way to make sure any string the user gives me is only something I define?
Is the only solution something like the following?
delete aa['toString'];
delete aa['hasOwnProperty'];
etc...
This may work for you:
function getValue(id){
return (!isNaN(aa[id])) ? aa[id] : undefined;
}
Alternatively, I recommend this generic solution:
function getValue(hash,key) {
return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined;
}
Note the following: The key will internally be converted to a string because the key is actually a name of an attribute.
var test = {
2: "Defined as numeric",
"2": "Defined as string"
}
alert(test[2]); // Alerts "Defined as string"
If trying to use an object:
var test = {}, test2 = {};
test[test2] = "message"; // Using an object as a key.
alert(test[test2]); // Alerts "message". It looks like it works...
alert(test[test2.toString()]);
// If it really was an object this would not have worked,
// but it also alerts "message".
Now that you know that it is always a string, let’s use it:
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".
One possibility would be to use hasOwnProperty to check that the key is something you explicitly added to the array. So instead of:
function findNumber(userEnteredKey) {
return aa[userEnteredKey];
}
you'd say:
function findNumber(userEnteredKey) {
if (Object.prototype.hasOwnProperty.call(aa, userEnteredKey))
return aa[userEnteredKey];
}
Alternately, you could use typeof to check that anything is a number before returning it. But I like the hasOwnProperty approach, because it'll keep you from returning anything that you didn't intentionally put in the array.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With