2

假设我们对 SomeClass 进行了分类。

class SomeClass < SomeClassThatAssignAttributesOnInitialization
  attr_accessor :group
  attr_accessor :name
end

及其实例数组

arr = [SomeClass.new(group:0, name:'one'),
       SomeClass.new(group:0, name:'two'),
       SomeClass.new(group:1, name:'three'),
       SomeClass.new(group:1, name:'four')]

我需要将每个组的第一个元素放入数组中。

现在它可以通过下一个方式工作

current_group = nil
first_elements = arr.map do |instance|
  if current_group != instance.group
    current_group = instance.group
    instance.name
  end
end

这很好用,但我认为有某种“Ruby”方法可以做到这一点。

有谁能够帮助我?

谢谢

4

4 回答 4

3

Rubygroup_by在对象上有一个方便的方法Enumerable,它返回一个Hash

arr.group_by(&:group)
# => {0=>[#<SomeClass group=0, name="one">, #<SomeClass group=0, name="two">], 1=>[#<SomeClass group=1, name="three">, #<SomeClass group=1, name="four">]}

因此,只需将一些方法链接到最后:

arr.group_by(&:group).values.map {|vs| vs[0].name}
# => ["one", "three"]
于 2012-12-18T14:56:19.340 回答
2
arr.group_by(&:group).values.map(&:first)
于 2012-12-18T14:56:50.370 回答
1

为什么不只是:

first_elements = arr.map(&:name)
于 2012-12-18T14:52:59.480 回答
1
SomeClass = Struct.new(:group, :name)

arr = [
  SomeClass.new(0, 'one'),
  SomeClass.new(0, 'two'),
  SomeClass.new(1, 'three'),
  SomeClass.new(1, 'four')
]

arr.group_by(&:group).values.map(&:first)
# => [
#   #<struct SomeClass group=0, name="one">,
#   #<struct SomeClass group=1, name="three">
# ]

或仅获取名称:

arr.group_by(&:group).values.map(&:first).map(&:name)
于 2012-12-18T15:01:20.350 回答