结合两个词典:javascript中的perl“hashrefslice”语法?

时间:2014-01-27 00:49:35

标签: node.js perl dictionary hashmap

我有单独的配置文件,这些配置文件是独立的,因为其中包含密码和其他敏感数据,而且我不介意看世界。所以我想说:

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中“取消引用”字典/哈希。此解决方案还结合了两个词典,而没有专门引用元素(如果我只想要sensitivedata中的globalconfig只有一些但不是全部)。

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如果您正在使用jQuery,那么有一个很好的extend函数:

$.extend(globaldata, sensitivedata);

否则我想你需要自己动手,但这并不难。有了最新版本的Javascript,它就是:

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

by by,in Perl,

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

会更清楚地表达为

values %{ $sensitivedata }

答案 2 :(得分:0)

我无法让Iterator在node.js中工作,但我确实找到了Sean回答的解决方法。

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