在 JavaScript 中,我想执行以下操作:
var pi = {};
pi[0]['*']['*'] = 1;
当然这会引发“无法读取未定义的属性‘*’”错误。很明显,我可以定义 p[0] = {},但这有点麻烦,因为我会在不同的属性中添加很多不同的值,例如
pi[2]['O']['I-GENE'] = 1;
等散列中的第一个键只是一个整数,所以我想我可以在顶层使用数组而不是散列,然后像这篇文章中那样进行默认初始化:
但这并不能满足我对其他散列进行默认初始化的需要。
看起来我正在尝试做的是与 ECMAScript 规范相冲突,ECMAScript 规范表明对象的未定义属性(在 JavaScript 中是哈希)应该返回未定义,如下所述:
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]++;
}
我真的很想在这里避免这种情况,或者至少找到一些通过原型(prototype)方法添加到 Hash 功能的好方法。然而,由于 JavaScript 中的 Hash 和 Object 似乎是同一事物,我们无法在不影响很多其他事物的情况下真正使用 JavaScript 中的默认哈希行为......
也许我应该编写自己的哈希类......或者使用原型(prototype):
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
啊,这么多选择 - 希望我知道这里的最佳实践......
最佳答案
这可以使用 ES6 proxies 来完成.您将使用 get
处理程序在对象上定义代理。当对具有 undefined
值或对象没有自己的属性的键执行 get
时,您将其设置为使用相同属性的新代理获取
处理程序并返回新代理。
此外,这不需要括号语法就可以工作:
var obj = ...;
obj.a.b.c = 3;
不幸的是,作为 ES6 功能,它们的支持仅限于 Firefox,并且可以在 Chrome 中使用实验性标志启用它们。
关于javascript - 嵌套 javascript 哈希的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15944956/