javascript - 嵌套 javascript 哈希的默认值

标签 javascript jquery hash prototypejs mootools

在 JavaScript 中,我想执行以下操作:

var pi = {}; pi[0]['*']['*'] = 1;

当然这会引发“无法读取未定义的属性‘*’”错误。很明显,我可以定义 p[0] = {},但这有点麻烦,因为我会在不同的属性中添加很多不同的值,例如

pi[2]['O']['I-GENE'] = 1;

等散列中的第一个键只是一个整数,所以我想我可以在顶层使用数组而不是散列,然后像这篇文章中那样进行默认初始化:

default array values

但这并不能满足我对其他散列进行默认初始化的需要。

看起来我正在尝试做的是与 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/

相关文章:

javascript - Jquery ui 自动完成功能在部分 View 中不起作用

javascript - 循环每个 div 然后应用 css

php - 我无法收到火灾警报。我缺少什么?

sql-server - 在 SQL Server 中获取 HASHBYTES() 方法的不同结果

mysql - 使用 fetchrow_hashref 存储数据

javascript - 注册验证

javascript - 在 CakePHP 3 中使用 AngularJS 从 Firebase 检索数据

javascript - Dojo 拖放 "list in list"(嵌套列表)

javascript - 为什么我们在加密后执行 toString ('hex' ) ?

javascript - 为什么拖放 Js 会破坏 php 文件的上传过程?