ruby array/list 的多类分区函数

Multiclass partition function for ruby array/list

我刚刚深入了解 ruby 的功能方面,正在摆弄 map/reduce 和一些过滤。

我现在已经有了一个具有以下结构的项目列表:

{:price=>100.0, :size=>'small', :description=>'some description'} 

:size 的值可能是 ['small', 'medium', 'large'] 之一。

有没有一种方法可以将整个列表划分为仅包含大小为小、中和大的元素的子列表,而无需为每个值设置过滤函数?

基本上我问的是是否有一些多类Array.partition。

感谢您的帮助!

input = [
  {:price=>100.0, :size=>'small', :description=>'some description 1'},
  {:price=>100.0, :size=>'large', :description=>'some description 2'},
  {:price=>100.0, :size=>'small', :description=>'some description 3'},
  {:price=>100.0, :size=>'large', :description=>'some description 4'},
  {:price=>100.0, :size=>'small', :description=>'some description 5'},
  {:price=>100.0, :size=>'small', :description=>'some description 6'}
]

input.group_by { |e| e[:size] }

是否认为结果不应该包含散列中的大小,使用Hash#delete来改变元素:

input.group_by { |e| e.delete :size }
#⇒ {
#  "large" => [
#    [0] {
#      :description => "some description 2",
#            :price => 100.0
#    },
#    [1] {
#      :description => "some description 4",
#            :price => 100.0
#    }
#  ],
#  "small" => [
#    [0] {
#      :description => "some description 1",
#            :price => 100.0
#    },
#    [1] {
#      :description => "some description 3",
#            :price => 100.0
#    },
#    [2] {
#      :description => "some description 5",
#            :price => 100.0
#    },
#    [3] {
#      :description => "some description 6",
#            :price => 100.0
#    }
#  ]
# }

我相信你正在寻找 Enumberable#group_by:

list = [
  {:price=>100.0, :size=>'small', :description=>'some description'},
  {:price=>123.0, :size=>'small', :description=>'some description 2'},
  {:price=>456.0, :size=>'medium', :description=>'some description 3'}
]

list.group_by {|item| item[:size]}
  # => {
  #      "small" => [
  #        {:price=>100.0, :size=>"small", :description=>"some description"},
  #        {:price=>123.0, :size=>"small", :description=>"some description 2"}
  #      ],
  #      "medium" => [
  #        {:price=>456.0, :size=>"medium", :description=>"some description 3"}
  #      ]
  #    }