遍历2个数组并根据匹配结果构建一个新数组

时间:2019-04-15 16:57:40

标签: ruby-on-rails ruby

好的,所以我有一个“获奖者ID”数组,该数组代表在上一轮比赛中获胜的用户。然后,我有一个称为“锦标赛参与”的对象数组,该对象表示已参加锦标赛的所有用户(多对多关系联接表)。

对于每个“获胜者ID”,我要遍历“锦标赛参与”数组,并使用与“获胜者ID”匹配的user_id查找比赛参与,然后将其推入名为“全面参与”的新数组中。

我尝试了下面的代码,但总是得到原始的'winner_ids'数组。...

@challenges = Challenge.where(tournament_id: @tournament.id)
@winner_ids = @challenges.pluck(:winner_id)
@tournament_participations = @tournament.tournament_participations
@round_participations = []
@round_participations = @winner_ids.each do |winner_id|
   @round_participation = @tournament_participations.where(user_id: winner_id)
   @round_participations << @round_participation
end

2 个答案:

答案 0 :(得分:4)

each返回被调用的可枚举值;在这种情况下,@winner_ids.each返回@winner.ids。您无需将迭代结果分配给@round_participations

还要检查the map method

答案 1 :(得分:1)

使用map方法而不是.each。

可以使用map方法基于原始数组创建一个新数组,但要使用提供的块修改的值。请参见下面的示例。

对于每种方法

irb(main):001:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):002:0> arr.each { |a| print a -= 10, " " }
-9 -8 -7 -6 -5 
=> [1, 2, 3, 4, 5]

您可以看到迭代后它返回了原始数组。但是对于地图

irb(main):005:0> arr = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):006:0> arr.map { |a| 2*a }
=> [2, 4, 6, 8, 10]

地图可以转换数组的内容,这意味着它可以对数组中的每个元素执行操作。