Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 按键值分组哈希,同时将其他键值合并为字符串_Arrays_Ruby_Hash - Fatal编程技术网

Arrays 按键值分组哈希,同时将其他键值合并为字符串

Arrays 按键值分组哈希,同时将其他键值合并为字符串,arrays,ruby,hash,Arrays,Ruby,Hash,我见过很多类似的问题,但这是一个非常具体的案例 我的意见是: entries = [ {:action=>"X", :sequence=>1}, {:action=>"Y", :sequence=>2}, {:action=>"W", :sequence=>2}, {:action=>"Z", :sequence=>3} ] 我想要作为输出的内容(按顺序用“and”连接动作,所有动作用“,”): “X、Y和W、Z” 我是如

我见过很多类似的问题,但这是一个非常具体的案例

我的意见是:

entries = [
   {:action=>"X", :sequence=>1},
   {:action=>"Y", :sequence=>2},
   {:action=>"W", :sequence=>2},
   {:action=>"Z", :sequence=>3}
]
我想要作为输出的内容(按顺序用“and”连接动作,所有动作用“,”):

“X、Y和W、Z”

我是如何做到的:

group = entries.group_by {|x| x.delete(:sequence)}.values
=> [[{:action=>"X"}], [{:action=>"Y"}, {:action=>"W"}], [{:action=>"Z"}]]

array = group.map { |el| el.map { |h| h[:action] } }
=> [["X"], ["Y", "W"], ["Z"]]

string = array.map { |a| a.join(' and ') }.join(', ')
=> "X, Y and W, Z"

它是有效的,但还远远不够干净。有谁有更好的解决方案吗?

以下是我能想到的最短的解决方案:

entries.group_by { |e| e.delete :sequence }
       .values
       .map { |e| e.map(&:values).join ' and ' }
       .join ', '
另一个[非破坏性]:

entries.map(&:values)
       .group_by(&:last)
       .values
       .map { |e| e.map(&:first).join ' and ' }
       .join ', '
甚至:

 entries.map(&:values)
        .group_by(&:pop)
        .values
        .map { |e| e.join ' and ' }
        .join ', '

下面是我能想到的最短的一个:

entries.group_by { |e| e.delete :sequence }
       .values
       .map { |e| e.map(&:values).join ' and ' }
       .join ', '
另一个[非破坏性]:

entries.map(&:values)
       .group_by(&:last)
       .values
       .map { |e| e.map(&:first).join ' and ' }
       .join ', '
甚至:

 entries.map(&:values)
        .group_by(&:pop)
        .values
        .map { |e| e.join ' and ' }
        .join ', '

或者您可以使用
每个\u对象玩
方法:

entries.each_with_object(Hash.new {[]}) do |e, m|
  m[e[:sequence]] <<= e[:action]
end.values
   .map{|e| e.join(' and ')}
   .join(", ")
#=> "X, Y and W, Z"
条目。每个带有_对象(Hash.new{[]})的| e,m|

m[e[:sequence]或者您可以使用对象玩
每个\u
方法:

entries.each_with_object(Hash.new {[]}) do |e, m|
  m[e[:sequence]] <<= e[:action]
end.values
   .map{|e| e.join(' and ')}
   .join(", ")
#=> "X, Y and W, Z"
条目。每个带有_对象(Hash.new{[]})的| e,m|

m[e[:序列]]如何区分“Y”和“W”(都是序列2)?看起来在你的输出中,它们分别与“X”和“Z”关联,但是这两个可以在输出中交换吗?你是对的,我错了。固定,它的“X,Y和W,Z”。如何区分“Y”和“W”(都是序列2)?看起来在你的输出中,它们分别与“X”和“Z”关联,但是这两个可以在输出中交换吗?你是对的,我错了。固定,它的“X,Y和W,Z”。