具有多个值的Ruby数组按键分组

具有多个值的Ruby数组按键分组,ruby,arrays,hashtable,Ruby,Arrays,Hashtable,我有一个Ruby数组: [ {tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}, {tags: [2,4]}, {tags: [2,5]} ] 我需要按对象的标记对对象进行分组: { 1: [{tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}], 2: [{tags: [1,2]}, {tags: [2,4]}, {tags: [2,5]}], 3: [{ta

我有一个Ruby数组:

[
    {tags: [1,2]},
    {tags: [1,3]},
    {tags: [1,4]},
    {tags: [2,4]},
    {tags: [2,5]}
]
我需要按对象的标记对对象进行分组:

{
    1: [{tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}],
    2: [{tags: [1,2]}, {tags: [2,4]}, {tags: [2,5]}],
    3: [{tags: [1,3]}],
    4: [{tags: [1,4]}, {tags: [2,4]}],
    5: [{tags: [2,5]}]
}
有没有神奇的Ruby方法可以做到这一点?

使用:

标记=[
{tags:[1,2]},
{tags:[1,3]},
{tags:[1,4]},
{tags:[2,4]},
{标记:[2,5]}
]
标记。每个带有_对象的_(Hash.new{| h,k | h[k]=[]){| h,result|
h[:tags]。每个{n |结果[n]{1=>[{:tags=>[1,2]},{:tags=>[1,3]},{:tags=>[1,4]},
#2=>[{:tags=>[1,2]},{:tags=>[2,4]},{:tags=>[2,5]}],
#3=>[{:tags=>[1,3]}],
#4=>[{:tags=>[1,4]},{:tags=>[2,4]}],
#5=>[{:tags=>[2,5]}]}

我会这样做:

array = [{tags: [1,2]}, {tags: [1,3]}, {tags: [1,4]}, {tags: [2,4]}, {tags: [2,5]}]

result = Hash.new { |hash, key| hash[key] = [] }

array.each do |tags|
  tags[:tags].each { |tag| result[tag] << tags }
end

puts result
#=> {1=>[{:tags=>[1, 2]}, {:tags=>[1, 3]}, {:tags=>[1, 4]}], 
#    2=>[{:tags=>[1, 2]}, {:tags=>[2, 4]}, {:tags=>[2, 5]}], 
#    3=>[{:tags=>[1, 3]}], 
#    4=>[{:tags=>[1, 4]}, {:tags=>[2, 4]}], 
#    5=>[{:tags=>[2, 5]}]}
array=[{tags:[1,2]},{tags:[1,3]},{tags:[1,4]},{tags:[2,4]},{tags:[2,5]}]
result=Hash.new{| Hash,key | Hash[key]=[]}
array.each do|标记|
标记[:标记]。每个{标记|结果[标记]{1=>[{:标记=>[1,2]},{:标记=>[1,3]},{:标记=>[1,4]},
#2=>[{:tags=>[1,2]},{:tags=>[2,4]},{:tags=>[2,5]}],
#3=>[{:tags=>[1,3]}],
#4=>[{:tags=>[1,4]},{:tags=>[2,4]}],
#5=>[{:tags=>[2,5]}]}

我建议如下:

tags.each_with_object({}) {|g,h| g.values.flatten.each {|i| (h[i]||=[]) << g}}
  #=> {1=>[{:tags=>[1, 2]}, {:tags=>[1, 3]}, {:tags=>[1, 4]}], 
  #    2=>[{:tags=>[1, 2]}, {:tags=>[2, 4]}, {:tags=>[2, 5]}],
  #    3=>[{:tags=>[1, 3]}],
  #    4=>[{:tags=>[1, 4]}, {:tags=>[2, 4]}],
  #    5=>[{:tags=>[2, 5]}]}
tags.each_with_object({}){{g,h{g.values.flatte.each{i}(h[i]| |=[]){1=>[{:tags=>[1,2]},{:tags=>[1,3]},{:tags=>[1,4]},
#2=>[{:tags=>[1,2]},{:tags=>[2,4]},{:tags=>[2,5]}],
#3=>[{:tags=>[1,3]}],
#4=>[{:tags=>[1,4]},{:tags=>[2,4]}],
#5=>[{:tags=>[2,5]}]}

这里面有什么问题吗?你有什么具体的问题吗?@MarkThomas问题在标题中。给定一个Ruby哈希元素数组,我想根据每个哈希的数组属性中的值对这些元素进行索引。用文字描述比向你展示代码更难。因此,我提出了一个简洁的问题w专注于代码。@MarkThomas,这个问题类似于:“序列3、9、18、30、45中的下一个数字是什么?”在阅读答案之前,我无法理解这个问题。似乎如果
I
满足
h[:tags]。包含?[I]=>true
对于五个哈希值
h
中的至少一个,则
i
是返回哈希值中的一个键,其值是所有哈希值
h
的数组,其中
h[:标记]。包括?[i]=>true
(序列中的下一个元素由
3(n+n^2)/2
给出)不要只把问题放在标题中,也要在问题的主体中重申它。此外,我没有看到任何代码,只有散列的定义,但没有任何可能操纵它或创建它的内容。我们需要知道你写了什么来尝试自己解决这个问题。堆栈溢出不是“为我编写代码”服务,而是“我需要我编写的代码的帮助"服务。是一个由社区维护/主持的网站,目标是成为类似维基百科的编程问题和解决方案概要。因此,有强烈鼓励的问题标准,当遵循这些标准时,可以帮助我们回答问题,其他搜索类似答案的人可以找到这些问题。作为大约有一段时间,我意识到了这些事情,并试图帮助你完成这些。回答得好,很感谢你找出了问题所在。谢谢@spickermann。这与我自己的想法类似,但你将块传递给
散列。新建
是一种优雅的方式。你一定也找到了问题所在,consi你的答案紧跟着falsetru的答案。仅此一点+1,但答案也不错。
tags.each_with_object({}) {|g,h| g.values.flatten.each {|i| (h[i]||=[]) << g}}
  #=> {1=>[{:tags=>[1, 2]}, {:tags=>[1, 3]}, {:tags=>[1, 4]}], 
  #    2=>[{:tags=>[1, 2]}, {:tags=>[2, 4]}, {:tags=>[2, 5]}],
  #    3=>[{:tags=>[1, 3]}],
  #    4=>[{:tags=>[1, 4]}, {:tags=>[2, 4]}],
  #    5=>[{:tags=>[2, 5]}]}