【发布时间】:2024-01-20 19:40:01
【问题描述】:
在 JavaScript 中,我想执行以下操作:
var pi = {};
pi[0]['*']['*'] = 1;
当然,这会引发“无法读取未定义的属性 '*'”错误。显然我可以定义 p[0] = {},但这有点痛苦,因为我将在不同的属性中粘贴许多不同的值,例如
pi[2]['O']['I-GENE'] = 1;
等等。散列的第一个键只是一个整数,所以我想我可以在顶层使用一个数组而不是散列,然后像这篇文章一样默认初始化:
但这并不能满足我对其他哈希默认初始化的需求。
看起来我正在尝试做的是违反 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]++;
}
我真的很想避免在这里,或者至少找到一些通过原型方法添加到哈希功能的好方法。然而似乎因为 JavaScript 中的 Hash 和 Object 是一回事,我们不能在不影响很多其他东西的情况下真正使用 JavaScript 中的默认哈希行为......
也许我应该编写自己的 Hash 类...或使用原型:
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
啊,这么多选择 - 希望我知道这里的最佳做法......
【问题讨论】:
-
嘿 - 这让我想起了去年关于 mootools 的一个有争议的 PR:github.com/mootools/mootools-core/pull/2191 - Object.get/set 方法(不是 .prototype),它自动做到了。没有登陆,Daniel 停止贡献,因为 :D - 他的实现非常合理 - github.com/csuwldcat/mootools-core/blob/master/Source/Types/… - 可以在没有 mootools 的情况下轻松工作
标签: javascript jquery hash prototypejs mootools