1

オブジェクトを含む 2 つの配列があるとします。これらのオブジェクトには、datetime 属性と固定数のメトリックがあります。私がする必要があるのは、2 つの配列をマージし、datetime でメトリックを合計することです。

配列 1:

#<ReadingsProvider::Reading:0x007fc52dd5a0a8 @start_date=2012-12-09 03:00:00 UTC, @item1=13, @item2=46, @item3=6, @item4=4, @item5=9, @item6=17, @item7=34>, 
#<ReadingsProvider::Reading:0x007fc52dbd54d0 @start_date=2012-12-09 04:00:00 UTC, @item1=43, @item2=90, @item3=7, @item4=4, @item5=9, @item6=17, @item7=34>, 

アレイ 2

#<ReadingsProvider::Reading:0x007fc52db95f88 @start_date=2012-12-09 03:00:00 UTC, @item1=23, @item2=16, @item3=5, @item4=6, @item5=8, @item6=20, @item7=36>, 
#<ReadingsProvider::Reading:0x007fc52db591f0 @start_date=2012-12-09 04:00:00 UTC, @item1=76, @item2=12, @item3=6, @item4=5, @item5=10, @item6=17, @item7=33>

最終的な配列(私の手計算が正しいと仮定して...)

#<ReadingsProvider::Reading:0x007fc52db95f88 @start_date=2012-12-09 03:00:00 UTC, @item1=36, @item2=62, @item3=11, @item4=10, @item5=17, @item6=37, @item7=70>, 
#<ReadingsProvider::Reading:0x007fc52db591f0 @start_date=2012-12-09 04:00:00 UTC, @item1=119, @item2=102, @item3=13, @item4=9, @item5=19, @item6=34, @item7=67>
4

2 に答える 2

0

私がやったこと...それが期待どおりに機能していることを確認するためにテストが必要です。

def merge_arrays(array1, array2)
  result = array1.concat(array2).group_by(&:start_date).map do |date, array|
    my_hash = {
      start_date: date,
      item1: array.map(&:item1).inject(:+),
      item2: array.map(&:item2).inject(:+),
      item3: array.map(&:item3).inject(:+),
      item4: array.map(&:item4).inject(:+),
      item5: array.map(&:item5).inject(:+),
      item6: array.map(&:item6).inject(:+),
      item7: array.map(&:item7).inject(:+)
    }
    ReadingsProvider::Reading.new(my_hash)
  end

  result
end
于 2012-12-10T21:20:03.537 に答える
0

特定のタスクですが、いくつかのコードを記述しようとしています。まず、ReadingsProvider::Reading にメソッドをインクルードします。

def concat_with(another)
  if @reading_start_date == another.instance_variable_get(:@reading_start_date)
    instance_variables.each do |var|
      if var.to_s.include?("item") && another_value = another.instance_variable_get(var)
        another.instance_variable_set(var, another_value + instance_variable_get(var))
      end
    end
  end
end

次に、一般的なアプローチ:

array1.map do |reading|
  array2.map do |another|
    reading.concat_with(another)
  end
end.flatten.compact

もっと知っていれば、とにかくコードはもっとエレガントになるはずです。このコードは見た目が悪いです。

于 2012-12-10T21:23:27.683 に答える