如何在Ruby中循环遍历不同长度的数组?

时间:2016-01-20 00:52:52

标签: ruby-on-rails arrays ruby loops nested-loops

让我们说我有两个关系数组,用户每天买卖。

如何使用.each迭代它们并且仍然让较长的数组在较短的数组耗尽后独立运行。下面我想找出某人每日购买和销售的比例。但是不能得到这个比例,因为它总是1,因为我对较短阵列的每个项目迭代一次较长的数组。

users = User.all
ratios = Hash.new

users.each do |user|

  if user.buys.count > 0 && user.sells.count > 0

    ratios[user.name] = Hash.new
    buy_array = []
    sell_array = []
    date = ""

    daily_buy = user.buys.group_by(&:created_at)
    daily_sell = user.sells.group_by(&:created_at)

    daily_buy.each do |buy|
      daily_sell.each do |sell|
        if buy[0].to_date == sell[0].to_date
          date = buy[0].to_date
          buy_array << buy[1]
          sell_array << sell[1]
        end
      end
    end
    ratio_hash[user.name][date] = (buy_array.length.round(2)/sell_array.length)
  end
end

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以通过执行以下操作来连接两个数组并删除重复的元素:

(a_array + b_array).uniq.each do |num|
  # code goes here
end

Uniq method API

答案 1 :(得分:0)

daily_buy = user.buys.group_by(&:created_at)
 daily_sell = user.sells.group_by(&:created_at

  buys_and_sells = daily_buy + daily_sell

  totals = buys_and_sells.inject({}) do |hsh, transaction|
    hsh['buys'] ||= 0;
    hsh['sells']  ||= 0;
    hsh['buys'] += 1 if transaction.is_a?(Buy)
    hsh['sells'] += 1 if transaction.is_a?(Sell)
    hsh
  end

  hsh['buys']/hsh['sells']

我认为以上可能会这样做...而不是将每个东西收集到单独的数组中,将它们连接在一起,然后遍历组合数组中的每个项目,增加由返回的哈希的相应键中的计数。注入。

答案 2 :(得分:-1)

在这种情况下,您不能在每次循环使用时循环它们 这段代码会给你一个提示

ar = [1,2,3,4,5]
br = [1,2,3]

array_l = (ar.length > br.length) ? ar.length : br.length

for i in 0..array_l
    if ar[i] and br[i]
        puts ar[i].to_s + " " + br[i].to_s
    elsif ar[i]
      puts ar[i].to_s
    elsif br[i]
      puts br[i].to_s
    end
end