没有toString的关联数组等

时间:2008-12-15 03:58:42

标签: javascript object maps associative-array

我想创建一个关联数组:

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'];

等...

3 个答案:

答案 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];
}