在JavaScript中,我想要做以下操作:
``` var pi = {}; pi[0]['*']['*'] = 1; ```
当然,这会抛出“Cannot read property '*' of undefined”错误。显然,我可以定义`p[0] = {}`,但这有点麻烦,因为我将在不同的属性中插入许多不同的值,例如:
``` pi[2]['O']['I-GENE'] = 1; ```
等等。哈希表中的第一个键只是一个整数,所以我想我可以在顶层使用数组,然后像这篇文章中那样进行默认初始化: default array values 但这不能处理我需要默认初始化其他哈希表的需求。
似乎我尝试做的事情正在遭遇ECMAScript规范,该规范指示对象(在JavaScript中是哈希表)的未定义属性应返回undefined,如此处所述: Set default value of javascript object attributes
``` var pi = {}; pi[0]['*']['*'] = 1; ```
当然,这会抛出“Cannot read property '*' of undefined”错误。显然,我可以定义`p[0] = {}`,但这有点麻烦,因为我将在不同的属性中插入许多不同的值,例如:
``` pi[2]['O']['I-GENE'] = 1; ```
等等。哈希表中的第一个键只是一个整数,所以我想我可以在顶层使用数组,然后像这篇文章中那样进行默认初始化: default array values 但这不能处理我需要默认初始化其他哈希表的需求。
似乎我尝试做的事情正在遭遇ECMAScript规范,该规范指示对象(在JavaScript中是哈希表)的未定义属性应返回undefined,如此处所述: Set default value of javascript object attributes
有趣的是,其中包含一种危险的解决方法。
在其他地方,当我尝试使用类似这样的嵌套哈希时,我发现自己要写很长且丑陋的代码,例如:
function incrementThreeGramCount(three_grams,category_minus_two,category_minus_one,category){
if(three_grams[category_minus_two] === undefined){
three_grams[category_minus_two] = {};
}
if(three_grams[category_minus_two][category_minus_one] === undefined){
three_grams[category_minus_two][category_minus_one] = {};
}
if(three_grams[category_minus_two][category_minus_one][category] === undefined){
three_grams[category_minus_two][category_minus_one][category] = 0;
}
three_grams[category_minus_two][category_minus_one][category]++;
}
我希望在这里避免使用默认哈希行为,或者至少通过原型方法找到一些增加哈希功能的好方法。然而,由于JavaScript中的哈希和对象实际上是相同的东西,所以我们不能真正地在不影响其他很多东西的情况下玩弄默认哈希行为......
也许我应该编写自己的哈希类...或者使用原型:
http://prototypejs.org/doc/latest/language/Hash/
或者别人的:
http://www.daveperrett.com/articles/2007/07/25/javascript-hash-class/
或者MooTools:http://mootools.net/docs/more/Types/Hash
啊,太多选择了 - 希望我知道最佳实践...