来自两个哈希的 Ruby 单行代码


a = {"rows" => [{"id" => "231-z", "name" => 'jon', "age"=> 27, "state" => 'AL'}, 
                {"id" => "4121-x", "name" => 'ton', "age"=> 37, "state" => 'VA'}
               ]
    }
b = {"rows" => [{"key" => ["xyz","4121-x"], "value" =>{"sum" => 12312, "realage" => 29}}, 
                {"key" => ["xyz","231-z"], "value" =>{"sum" => 1212, "realage" => 33}}
               ]
    }

在哈希a中,age不正确

在哈希b中,realage是正确的。同样在哈希b id 是第一个数组中的第二个值,映射到哈希a id。这些是 4121-x,231-z 对应于哈希 a

我想更正哈希a中的年龄,并将其与哈希brealage交换我可以分多个步骤完成,但是是否可以在一个衬里或非常短的衬里中完成?所以最后正确的哈希a应该看起来像

a = {"rows" => [{"id" => "231-z", "name" => 'jon', "age"=> 33, "state" => 'AL'}, 
                {"id" => "4121-x", "name" => 'ton', "age"=> 29, "state" => 'VA'}
               ]
    }

看起来合理吗?

a['rows'].each_with_index do |ah, i|
  (bh = b['rows'].select {|h| h['key'].last == ah['id'] }.first) &&
    a['rows'][i] = ah.update('age' => bh['value']['realage'])
end
p a
{
    "rows" => [
        [0] {
               "id" => "231-z",
             "name" => "jon",
              "age" => 33,
            "state" => "AL"
        },
        [1] {
               "id" => "4121-x",
             "name" => "ton",
              "age" => 29,
            "state" => "VA"
        }
    ]
}

请注意,只有在b中找到相应的id时,它才会更新a

此外,行顺序无关紧

要,行数也无关紧要,重要的是b具有与a中处理的行具有相同id的行

这是一个工作演示

最新更新