["john", "mark", "tony"], "b"=> ["tom","tim"], "-6ren">
gpt4 book ai didi

ruby - 根据 Ruby 中该键的值数合并散列中的键值对的最佳方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:10 24 4
gpt4 key购买 nike

我在 ruby​​ 中有一个数组哈希:

 @people = { "a" => ["john", "mark", "tony"], "b"=> ["tom","tim"], 
"c" =>["jane"], "others"=>["rob", "ryan"] }

我想合并数组中特定键值少于 3 项的所有键值对。它们应该合并到名为“others”的键中,以大致给出

 @people = { "a" => ["john", "mark", "tony"], 
"others"=> ["rob", "ryan", "tom", "tim", "jane"] }

使用以下代码是有问题的,因为哈希中不能存在重复的键值:

 @people = Hash[@people.map{|k,v| v.count<3 ? ["others",v] : [k,v]} ] %>

优雅地解决这个问题的最佳方法是什么?

最佳答案

您几乎搞定了,正如您所注意到的,问题是您无法即时构建散列的键/值对,因为存在重复项。解决该问题的一种方法是从您要构建的框架开始:

@people = @people.each_with_object({ 'others' => [ ] }) do |(k,v), h|
if(v.length >= 3)
h[k] = v
else
h['others'] += v
end
end

或者,如果您不喜欢 each_with_object,您可以:

h = { 'others' => [ ] }
@people.each do |k, v|
# as above
end
@people = h

或者您可以使用与 inject 几乎相同的结构(像往常一样注意从 block 中返回正确的东西)。

当然还有其他方法可以做到这一点,但这些方法非常清晰易懂; IMO 清晰度应该是您的首要目标。

关于ruby - 根据 Ruby 中该键的值数合并散列中的键值对的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15562156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com