Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如果一个键相等,如何将散列数组分隔成不同的数组?_Ruby On Rails_Arrays_Ruby_Hash - Fatal编程技术网

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