我想创建一个关联数组:
var aa = {} //equivalent to Object(), new Object(), etc...
我希望确保我访问的任何密钥都是一个数字:
aa['hey'] = 4.3;
aa['btar'] = 43.1;
我知道JS没有输入,所以我不能自动检查这个,但我可以在我自己的代码中确保我只为这个aa分配字符串。
现在我正在从用户那里拿钥匙。我想显示该键的值。但是,如果用户给我一些类似“toString”的东西,他将返回一个函数,而不是int!有没有办法确保他给我的任何字符串只是我定义的东西?唯一的解决方案是:
delete aa['toString'];
delete aa['hasOwnProperty'];
等...
答案 0 :(得分:4)
一种可能性是使用hasOwnProperty来检查密钥是否是您明确添加到数组中的内容。所以而不是:
function findNumber(userEnteredKey) {
return aa[userEnteredKey];
}
你会说:
function findNumber(userEnteredKey) {
if (Object.prototype.hasOwnProperty.call(aa,userEnteredKey))
return aa[userEnteredKey];
}
或者,您可以使用typeof在返回之前检查任何内容是否为数字。但是我喜欢hasOwnProperty方法,因为它会阻止你返回任何你没有故意放入数组的东西。
答案 1 :(得分:3)
这对你有用吗?
function getValue(id){
return (!isNaN(aa[id])) ? aa[id] : undefined;
}
<强>更新强>
在 Moss Collum 和 pottedmeat 的帮助下,我推荐这个通用的解决方案:
function getValue(hash,key) {
return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined;
}
<强> UPDATE2:强> 忘记了“.call”。 (感谢pottedmeat指出这一点)
更新3:(关于密钥)
请注意以下内容:密钥将在内部转换为字符串,因为密钥实际上是属性的名称。
var test = {
2:"Defined as numeric",
"2":"Defined as string"
}
alert(test[2]); //Alerts "Defined as string"
如果尝试使用对象:
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".
现在你知道它总是一个字符串,让我们使用它:
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".
答案 2 :(得分:2)
答案真的很简单:当你创建一个新的密钥时,它会添加一些你自己的字符串常量。
var a = {};
var k = 'MYAPP.COLLECTIONFOO.KEY.';
function setkey(userstring)
{
a[k+userstring] = 42;
}
function getkey(userstring)
{
return a[k+userstring];
}