结合两个字典:JavaScript中的perl“hashrefslice”语法?

我有单独的configuration文件,因为其中包含密码和其他敏感数据,我不介意世界看到。 所以我们说我有:

sensitivedata = { password : 'foobaz', hostname : 'quux' }; globalconfig = { timeout : 86400, port : 5190 }; 

我希望globalconfig有字段passwordhostname 。 我可以这样做:

 globalconfig.hostname = sensitivedata.hostname; globalconfig.password = sensitivedata.password; 

但是当有很多领域时,这是很乏味的。 作为一名perl程序员,我想要做这样的事情:

 @{ $globalconfig }{ keys %{ $sensitivedata } } = @{ $sensitivedata }{ keys %{ $sensitivedata } }; # or ... @{ $globalconfig }{ qw{ password hostname } } = @{ $sensitivedata }{ qw{ password hostname } }; 

这也可以用map完成,但这正是我们在perl中使用hashrefslice语法的原因。 有没有一个单一的声明的方式来从一个字典到另一个字典的一堆字段?

它发生在我写这个,我也可以在Perl中做到这一点:

 subname( { %$globalconfig, %$sensitivedata } ); 

…为了传递它们的参数,将两个哈希链接到一个新的匿名哈希,但我不知道如何“解除”JavaScript中的字典/哈希值。 这个解决scheme还将两个字典结合在一起,而不是特别引用元素(如果我只想要globalconfig一些sensitivedata而不是所有的sensitivedata globalconfig )。

请温柔; 我不是故意煽动一种“我的语言与你的语言”的东西。 我很喜欢节点,我只是想借用我熟悉的习语,并有效地编写我的代码。

我不相信JavaScript提供了一个本地的方式来做到这一点; 如果你不是在谈论服务器端, https://github.com/stephenlb/jquery-hashslice/blob/master/jquery.hashslice.js可能会满足您的需求。

如果你碰巧使用jQuery,那么有一个很好的扩展函数:

 $.extend(globaldata, sensitivedata); 

否则,我想你需要推出自己的,但并不难。 使用最新版本的Javascript,它是:

 for (let [key, value] in Iterator(sensitivedata)) globaldata[key] = value; 

在Perl中,

 @{ $sensitivedata }{ keys %{ $sensitivedata } } 

会更清楚地expression为简单

 values %{ $sensitivedata } 

我无法让Iterator在node.js中工作,但是我find了一个解决Sean答案的方法。

 for (var key in add_headers) http_headers[key] = add_headers[key];