【问题标题】:Ruby: Create hash with default keys + values of an arrayRuby:使用默认键+数组值创建哈希
【发布时间】:2026-02-24 01:30:01
【问题描述】:

我相信之前有人在稍微不同的环境中问过/回答过这个问题,并且我已经看到一些与此有些相似的示例的答案 - 但似乎没有什么完全适合。

我有一组电子邮件地址:

@emails = ["test@test.com", "test2@test2.com"]

我想从这个数组中创建一个散列,但它必须如下所示:

input_data = {:id => "#{id}", :session => "#{session}", 
              :newPropValues => [{:key => "OWNER_EMAILS", :value => "test@test.com"} , 
                                 {:key => "OWNER_EMAILS", :value => "test2@test2.com"}]

我认为哈希中的Hash 中的Array 让我失望。但是我玩过injectupdatemergecollectmap 并且没有运气生成这种需要基于创建的动态散列@emails 数组中有多少条目。

有人对如何实现这一点有任何建议吗?

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    所以基本上你的问题是这样的:

    拥有这个数组:

    emails = ["test@test.com", "test2@test2.com", ....]
    

    你想要一个这样的哈希数组:

    output = [{:key => "OWNER_EMAILS", :value => "test@test.com"},{:key => "OWNER_EMAILS", :value => "test2@test2.com"}, ...]
    

    一种解决方案是:

    emails.inject([]){|result,email| result << {:key => "OWNER_EMAILS", :value => email} }
    

    更新:我们当然可以这样做:

    emails.map {|email| {:key => "OWNER_EMAILS", :value => email} }
    

    【讨论】:

    • inject 绝对是最好的解决方案
    • 啊哈!所以这就是我要注射的方式!这对我有很大帮助.. 它不仅解决了我的问题,而且让我更好地理解了注入。谢谢!
    • 在其他语言中,inject 或 map_reduce 确实是一种很酷的方式来迭代集合 + 对其所有元素应用一些操作,并在迭代时将部分结果移动到后续元素。
    • 原谅我的无知,emails.map {|email| {:key =&gt; "OWNER_EMAILS", :value =&gt; email} } 有什么问题?
    • @sepp2k 你是一个真正的大师 ;),使用 #map 当然可以,但我想展示注入的其他用途:D 谢谢!