我想创建关联数组:

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];
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top