Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套javascript哈希的默认值_Javascript_Jquery_Hash_Prototypejs_Mootools - Fatal编程技术网

嵌套javascript哈希的默认值

嵌套javascript哈希的默认值,javascript,jquery,hash,prototypejs,mootools,Javascript,Jquery,Hash,Prototypejs,Mootools,在JavaScript中,我希望执行以下操作: var pi={}; pi[0]['*']['*']=1 当然,这会引发一个“无法读取未定义属性“*”的错误”。显然,我可以定义p[0]={},但这是一种痛苦,因为我将在不同的属性中粘贴许多不同的值,例如 pi[2]['O']['I-GENE']=1 等等。散列中的第一个键只是一个整数,所以我想我可以在顶层使用数组而不是散列,然后像本文中那样进行默认初始化: 但这不能满足我对其他哈希的默认初始化需求 我试图做的似乎是针对ECMAScript规范运

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

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

当然,这会引发一个“无法读取未定义属性“*”的错误”。显然,我可以定义p[0]={},但这是一种痛苦,因为我将在不同的属性中粘贴许多不同的值,例如

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

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

但这不能满足我对其他哈希的默认初始化需求

我试图做的似乎是针对ECMAScript规范运行,该规范指示对象的未定义属性(在JavaScript中是散列)应返回未定义的属性,如下所述:

有趣的是,其中包括一项危险的工作

在我尝试使用这种嵌套哈希的其他地方,我发现自己正在编写这样的长代码:

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中的散列和对象是一样的,我们不能在不影响其他很多事情的情况下真正处理JavaScript中的默认散列行为

也许我应该写我自己的哈希类。。。或使用原型:

或其他人:

或mootools:


啊,这么多选择-希望我知道这里的最佳实践…

我会这样做:

Object.prototype.get = function(v){ 
    if(!this[v]){
        this[v] = {} 
    } 

    return this[v];  
}
然后,改为使用
object[“x”][“y”].z=666
获取对象.get(“x”).get(“y”).z=666
这可以通过使用来完成。您可以使用
get
处理程序在对象上定义代理。当对具有
未定义的
值或对象没有自己属性的键执行
get
时,可以将其设置为使用相同
get
处理程序的新代理,并返回该新代理

此外,这将在不需要括号语法的情况下工作:

var obj = ...;
obj.a.b.c = 3;

不幸的是,作为一项ES6功能,它们的支持仅限于Firefox,并且可以在Chrome中使用实验性标志启用它们。

您可以编写一个简单的帮助程序来实现这一点。 e、 g

这里有一个关于的演示,使用
|124;=
可以执行以下操作:

const pi=[];
((((π[0]|={})['*'])|={})['*']=1);

log(JSON.stringify({pi}))不幸的是,目前只有firefox支持代理对象。也许你可以把它作为一个注释放进去,它们在Chrome stable中受支持,并且启用了
Enable Experimental JavaScript
标志,因为它们在V8中已经存在很长时间了。我确信当规范最终确定后,它们将在下一次稳定推送中启用。很好,Thx我不知道chrome支持代理作为实验+1这看起来很酷,但它对其他可能依赖返回“undefined”的默认get行为的库是否有危险的副作用?我喜欢的是这个mod,但仅限于本地代码-因此哈希类似乎更安全,不是吗?好吧,有些lib也可能定义了
get
方法,所以尝试使用更独特的名称,如
get\u或\u initialize
。。。或者考虑较少冗长的名字,比如<代码> <代码>:Ah得到你-对不起,我错过了你建议把语法改成.GET(“X”)-是的,希望我能坚持''x' ],不要太冗长了——我猜。而且,我创建的任何自定义哈希类也必须更改语法-我想我不能轻易重写类似[]运算符的Object.prototype。[]=function(v){…Heh-这让我想起了去年mootools上有争议的PR:-Object.get/set方法(而不是.prototype)这是自动完成的。没有着陆,Daniel停止了贡献,因为:D-他的实现非常合理-可以轻松地使用mootools
function setWDef() {
    var args = [].slice.call(arguments);
    var obj = args.shift();
    var _obj = obj;
    var val = args.pop();
    if (typeof obj !== "object") throw new TypeError("Expected first argument to be of type object");
    for (var i = 0, j = args.length - 1; i < j; i++) {
        var curr = args[i];
        if (!_obj[curr]) _obj[curr] = {};
        _obj = _obj[curr];
    }
    _obj[args.pop()] = val;
    return obj;
}   
var pi ={}
console.log (setWDef(pi,"0","*","a*",1)) //{"0": {"*": {"a*": 1}}}