我有一个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"
答案 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