Ruby on rails 如果一个键相等,如何将散列数组分隔成不同的数组?
我得到了如下形式的散列数组:Ruby on rails 如果一个键相等,如何将散列数组分隔成不同的数组?,ruby-on-rails,arrays,ruby,hash,Ruby On Rails,Arrays,Ruby,Hash,我得到了如下形式的散列数组: {"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>5.0} {"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.84
{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>5.0}
{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.8499999999999996}
{"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>0.0}
{"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.4}
基本上,我希望将该数组分割为包含键受益人\u文档
相同值的数组,因此在本例中,我希望有两个数组,其中一个包含:
{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>5.0}
{"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>0.0}
还有一个
{"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.4}
{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.8499999999999996}
我怎么能同意呢
非常感谢您的阅读。给定:
tst=[
{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>5.0},
{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.84},
{"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>0.0},
{"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.4}
]
您可以使用按键获取元素的散列。在本例中,使用传递到块的键[“受益人文档”]
,您将得到该键的数组哈希值——在本例中为2
你可以做:
tst.group_by { |h| h["beneficiary_document"] }
# {"43991028"=>[{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>5.0}, {"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"43991028", "calification_by_qualifier"=>0.0}], "71730550"=>[{"user_id"=>2, "user_name"=>"Pepo", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.84}, {"user_id"=>3, "user_name"=>"Carlos", "beneficiary_document"=>"71730550", "calification_by_qualifier"=>3.4}]}
要看到它打印得很漂亮:
您还可以使用散列来获得相同的结果,该散列返回数组作为,然后在tst
上调用.map
并通过该键将散列推入数组:
h=Hash.new { |h,k| h[k]=[] }
tst.map { |eh| h[eh["beneficiary_document"]].push(eh) }
或者,将其合并为一条语句:
tst.each_with_object(Hash.new { |h,k| h[k]=[] }) { |g,h|
h[g["beneficiary_document"]].push(g)}
这三种方法都创建相同的散列。第一个是最简单的 这里有三种方法可以通过构造散列然后提取值来获得所需的结果
arr = [{"id"=>2, "name"=>"Pepo", "doc"=>"43991028", "cal"=>5.0},
{"id"=>2, "name"=>"Pepo", "doc"=>"71730550", "cal"=>3.8},
{"id"=>3, "name"=>"Carlos", "doc"=>"43991028", "cal"=>0.0},
{"id"=>3, "name"=>"Carlos", "doc"=>"71730550", "cal"=>3.4}]
#1
它使用的形式包括一个块,该块在执行无键的哈希h
时被调用
arr.each_with_object(Hash.new { |h,k| h[k]=[] }) { |g,h| h[g["doc"]] << g }.
values
#=> [[{"id"=>2, "name"=>"Pepo", "doc"=>"43991028", "cal"=>5.0},
# {"id"=>3, "name"=>"Carlos", "doc"=>"43991028", "cal"=>0.0}],
# [{"id"=>2, "name"=>"Pepo", "doc"=>"71730550", "cal"=>3.8},
# {"id"=>3, "name"=>"Carlos", "doc"=>"71730550", "cal"=>3.4}]]
当您给出一个示例时,所有的输入和输出都应该是有效的Ruby对象。(有些读者如果没有投票就会投反对票。)这意味着你应该写
[{…},{…}]
。此外,为每个输入分配一个变量(例如,arr=[{“user\u id”=>2,…},{“user\u id”=>3,…}]
)也很有帮助。这样,读者就可以在答案和注释中引用这些变量,而无需定义它们。将示例简化为它们的基本要素,并对键和值使用简短的名称也很有帮助(部分是为了避免读者需要水平滚动来阅读您的代码)。这比我要去的地方要好得多,所以我不得不删除我的。很好!前两个非常有趣。第三个生成{nil=>[original list]}
因为默认散列中没有键。@dawg,请仔细检查#3。它不使用默认散列。我有一个小脚本,上面有你的示例arr
,然后我剪切并粘贴你的#1,#2,#3。前两个创建正确的输出;#3:{nil=>[{“id”=>2,“name”=>“Pepo doc 43991028”,“cal”=>5.0},“id”=>2,“name”,“doc”=>“71730550”,“cal”=>3.8},{“id”=>3,“name”=>“Carlos”,“doc”=>“43991028”,“cal”=>0.0},{“id”=>3,“name”=>“Carlos”,“doc”=>“71730550”,“cal”=>3.4}
.Ruby 2.4.1.我删除了所有三个上的.values
部分…原始数组是重复的,因为每个元素都被附加到一个键nil
@Dawg,谢谢。我修复了#3.在你发表评论后,我检查了我的代码好几次,但都没有发现h[g[“doc”]=>[g]
和g[“doc”=>[g]
:-)此外,在比较前一个#3和#1的返回值时,我显然不够仔细。
arr.each_with_object(Hash.new { |h,k| h[k]=[] }) { |g,h| h[g["doc"]] << g }.
values
#=> [[{"id"=>2, "name"=>"Pepo", "doc"=>"43991028", "cal"=>5.0},
# {"id"=>3, "name"=>"Carlos", "doc"=>"43991028", "cal"=>0.0}],
# [{"id"=>2, "name"=>"Pepo", "doc"=>"71730550", "cal"=>3.8},
# {"id"=>3, "name"=>"Carlos", "doc"=>"71730550", "cal"=>3.4}]]
arr.each_with_object({}) { |g,h| (h[g["doc"]] ||= []) << g }.
values
arr.each_with_object({}) { |g,h| h.update(g["doc"]=>[g]) { |_,o,n| o+n } }.
values