如何将2D数组转换为ruby中的值对象

时间:2017-03-31 16:54:09

标签: arrays ruby object

我有一个2D数组:

a = [["john doe", "01/03/2017", "01/04/2017", "event"], ["jane doe", "01/05/2017", "01/06/2017", "event"]...]

我想将它转换为ruby中的值对象。我在本问题的第二个答案中找到了如何使用散列Ruby / Replace value in array of hash但不是2D数组。我想将a[0][0]的值分配给名为"name"a[0][1]"date1"a[0][2]"date2"和{{1}的属性转到a[0][3]

这就像我想要完成的事情,虽然它不完整,我不知道如何在一个循环中为不同的属性分配多个索引:

"event"

4 个答案:

答案 0 :(得分:0)

您无法将键值对存储在数组索引中。您需要记住,数组的第一个索引将具有“名称”并分配a[0][0] = "foo"或者仅使用哈希数组来获得您想要的键值功能

2.3.0 :006 > a = []
 => [] 
2.3.0 :007 > hash1 = {name: "hash1name", date: "hash1date", event: "hash1event"}
 => {:name=>"hash1name", :date=>"hash1date", :event=>"hash1event"} 
2.3.0 :008 > a << hash1
 => [{:name=>"hash1name", :date=>"hash1date", :event=>"hash1event"}] 
2.3.0 :009 > hash2 = {name: "hash2name", date: "hash2date", event: "hash2event"}
 => {:name=>"hash2name", :date=>"hash2date", :event=>"hash2event"} 
2.3.0 :010 > a << hash2
 => [{:name=>"hash1name", :date=>"hash1date", :event=>"hash1event"}, {:name=>"hash2name", :date=>"hash2date", :event=>"hash2event"}] 

答案 1 :(得分:0)

听起来你想要调用与每个数组值对应的属性访问器方法。您使用send以编程方式调用方法。因此,您需要一个与给定数组中的值对应的方法名称数组。现在,假设具有属性的类称为Data

attrs = [:name, :date1, :date2, :event]
result = a.map do |e|
  d = Data.new
  e.each.with_index do |v, i|
    d.send(attrs[i], v)
  end
  d
end

result是从给定数组填充的Data个对象数组。

当然,如果你控制Data对象的定义,最好的方法是给它一个带有一组值的初始化方法。

答案 2 :(得分:0)

试试这个:

class Schedule_info
  arrt_accessor :name, :date1, :date2, :event

  def initialize arr
    @name = []
    @date1 = []
    @date2 = []
    @event = []
    arr.each |i| do
      name << i[0]
      date1 << i[1]
      date2 << i[2]
      event << i[3]
    end
  end

end

答案 3 :(得分:0)

这应该足够简洁,没有不必要的元编程:

data = [["john doe", "01/03/2017", "01/04/2017", "event"],
        ["jane doe", "01/05/2017", "01/06/2017", "event"]]

class ScheduleInfo
  attr_reader :name, :date1, :date2, :type

  def initialize(*params)
    @name, @date1, @date2, @type = params
  end

  def to_s
    format('%s for %s between %s and %s', type, name, date1, date2)
  end
end

p info = ScheduleInfo.new('jane', '31/03/2017', '01/04/2017', 'party')
# #<ScheduleInfo:0x00000000d854a0 @name="jane", @date1="31/03/2017", @date2="01/04/2017", @type="party">
puts info.name
# "jane"

schedule_infos = data.map{ |params| ScheduleInfo.new(*params) }
puts schedule_infos
# event for john doe between 01/03/2017 and 01/04/2017
# event for jane doe between 01/05/2017 and 01/06/2017