关联数组而不的toString等
-
21-08-2019 - |
题
我想创建关联数组:
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'];
等...
解决方案
这是否会为你工作?
function getValue(id){
return (!isNaN(aa[id])) ? aa[id] : undefined;
}
<强>更新强>
通过从帮助的莫斯科勒姆和 pottedmeat 的我推荐这个通用的解决方案:
function getValue(hash,key) {
return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined;
}
<强> UPDATE2:强> 已经忘了“.CALL”。 (感谢pottedmeat指出了这一点)
<强> UPDATE3:强>(关于密钥)
请注意以下几点:因为密钥实际上是一个属性的名称的键将在内部被转换为字符串。
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".
其他提示
一种可能性是使用hasOwnProperty检查,关键是你明确地添加到阵列中的东西。因此,而不是:
function findNumber(userEnteredKey) {
return aa[userEnteredKey];
}
你会说:
function findNumber(userEnteredKey) {
if (Object.prototype.hasOwnProperty.call(aa,userEnteredKey))
return aa[userEnteredKey];
}
另外,还可以使用的typeof检查什么是返回之前的数字。但我喜欢的hasOwnProperty方法,因为它会阻止你返回任何东西,你没有故意把在数组中。
真的答案很简单:当你创建一个新的密钥前面加上它与你自己的一些字符串常量。
var a = {};
var k = 'MYAPP.COLLECTIONFOO.KEY.';
function setkey(userstring)
{
a[k+userstring] = 42;
}
function getkey(userstring)
{
return a[k+userstring];
}
不隶属于 StackOverflow