【问题标题】:Merging two hashes by concatenating the arrays通过连接数组合并两个哈希
【发布时间】:2012-03-19 04:48:12
【问题描述】:

给定两个值为数组的哈希,合并它们的最佳方法是什么,以便当两者共享某个键时,结果值将是原始两个哈希值的串联?例如,给定两个哈希 h1h2

h1 = Hash.new{[]}.merge(a: [1], b: [2, 3])
h2 = Hash.new{[]}.merge(b: [4], c: [5])

我希望convolute 方法会给出:

h1.convolute(h2) #=> {:a => [1], b: [2, 3, 4], c: [5]}

【问题讨论】:

    标签: ruby arrays hash ruby-1.9


    【解决方案1】:

    这正是Hash#merge 所做的,如果你给它一个块:

    h1.merge(h2) do |key, v1, v2|
      v1 + v2
    end
    

    http://rubydoc.info/stdlib/core/1.9.2/Hash:merge

    【讨论】:

    • +1。也许<< 而不是+ 更好,而不是创建新数组。
    • @steenslag 但是 v1 和 v2 都是数组。
    • @sawa 是的,但是 v1 + v2 创建了一个新的(第三个)数组。
    • 我认为您的意思是v1.concat(v2)v1 << v2 将添加v2 作为v1 的最后一个元素,而不是连接。换句话说,v1 + v2v1.concat(v2) 是等价的,只是后者会变异 v1,而在问题示例中的 b 键的情况下,v1 << v2 会给你类似 [2, 3, [4]] 的东西。但是,我认为 OP 不想改变他/她的数据结构。肯定有优化的地方,比如不创建额外的不必要的对象,但它也是错误的常见来源。
    【解决方案2】:

    如果你不关心修改h2 那么:

    h1.each_with_object(h2) { |(k, v), h| h[k] += v }
    

    如果您想单独离开h2

    h1.each_with_object(h2.dup) { |(k, v), h| h[k] += v }
    

    如果你想要那个特定的顺序:

    h2.each_with_object(h1.dup) { |(k, v), h| h[k] += v }
    

    【讨论】:

    • 第三个就是那个。谢谢。
    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2012-09-16
    • 2014-10-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多