繁体   English   中英

没有 toString 等的关联数组

[英]Associative array without toString, etc

我想创建一个关联数组:

var aa = {} // Equivalent to Object(), new Object(), etc...

而且我想确保我访问的任何密钥都将是一个数字:

aa['hey'] = 4.3;
aa['btar'] = 43.1;

我知道 JavaScript 没有输入,所以我不能自动检查这个,但我可以在我自己的代码中确保我只为这个aa分配字符串。

现在我从用户那里拿走了钥匙。 我想显示该键的值。 然而,如果用户给我类似“toString”的东西,用户会得到一个函数,而不是一个整数! 有没有办法确保用户给我的任何字符串都是我定义的?

唯一的解决方案是这样的吗?

delete aa['toString'];
delete aa['hasOwnProperty'];

等等...

一种可能性是使用 hasOwnProperty 来检查键是否是您明确添加到数组中的内容。 所以而不是:

function findNumber(userEnteredKey) {
    return aa[userEnteredKey];
}

你会说:

function findNumber(userEnteredKey) {
    if (Object.prototype.hasOwnProperty.call(aa, userEnteredKey))
        return aa[userEnteredKey];
}

或者,您可以使用 typeof 在返回之前检查任何内容是否为数字。 但我喜欢 hasOwnProperty 方法,因为它会阻止您返回任何您无意放入数组的内容。

这可能对您有用:

function getValue(id){
  return (!isNaN(aa[id])) ? aa[id] : undefined;
}

或者,我推荐这个通用解决方案:

function getValue(hash,key) {
    return Object.prototype.hasOwnProperty.call(hash,key) ? hash[key] : undefined;
}

请注意以下事项: 键将在内部转换为字符串,因为键实际上是属性的名称。

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". 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".

现在您知道它始终是一个字符串,让我们使用它:

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".

当你创建一个新的键时,在它前面加上一些你自己的字符串常量:

var a = {};
var k = 'MYAPP.COLLECTIONFOO.KEY.';

function setkey(userstring)
{
  a[k + userstring] = 42;
}

function getkey(userstring)
{
  return a[k + userstring];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM