Ruby访问数组元素

8

我有一个看起来像这样的数组。

[{"EntryId"=>"2", "Field1"=>"National Life Group","DateCreated"=>"2010-07-30 11:00:14", "CreatedBy"=>"tristanoneil"},
 {"EntryId"=>"3", "Field1"=>"Barton Golf Club", "DateCreated"=>"2010-07-30 11:11:20", "CreatedBy"=>"public"},
 {"EntryId"=>"4", "Field1"=>"PP&D Brochure Distribution", "DateCreated"=>"2010-07-30 11:11:20", "CreatedBy"=>"public"}, 
 {"EntryId"=>"5", "Field1"=>"Prime Renovation Group, DreamMaker Bath & Kitchen",  "DateCreated"=>"2010-07-30 11:11:21", "CreatedBy"=>"public"}
]

我该如何遍历这个数组,以便我可以指定要打印出哪个字段并获取其值,这样我就可以做类似以下的事情。
puts EntryId.value
3个回答

7

看起来这几乎就像是一个哈希数组。假设它被存储在一个变量中,如下所示:

data = [{"EntryId"=>"2", "Field1"=>"National Life Group"},
        {"EntryId"=>"3", "Field1"=>"Barton Golf Club"},
        {"EntryId"=>"4", "Field1"=>"PP&D Brochure Distribution"}
       ]

可以通过方括号中的索引访问数组的单个元素。可以通过方括号中的键访问哈希表的值。例如,要获取第二个数组元素的“Field1”值,您可以使用:

data[1]["Field1"]

你可以使用在Enum mixin中定义的方法轻松地遍历数组。

如果你想处理数组,可以使用each:此代码将打印数组中每个元素的Entry Id值。

data.each{|entry| puts entry["EntryId"]}

这些数据不需要在变量中存储即可使用。您可以直接使用这些方法访问匿名数组:

例如,以下代码将返回一个字符串数组。其中每个元素是原始数组中相应元素的格式化变体。

[{"EntryId"=>"2", "Field1"=>"National Life Group"},
 {"EntryId"=>"3", "Field1"=>"Barton Golf Club"},
 {"EntryId"=>"4", "Field1"=>"PP&D Brochure Distribution"}
].map{|e| "EntryId: #{e["EntryId"]}\t Company Name: #{e["Field1"]}"}

7

花括号和箭头符号(=>)的存在意味着你正在处理Ruby哈希,而不是数组。

幸运的是,使用哈希非常容易检索与任何一个键(箭头符号左边的东西)相关联的值(箭头符号右边的东西):你只需要使用[]运算符即可。

entry = { "EntryId" => "2", "Field1" => "National Life Group", ... }
entry["EntryId"] # returns "2"

下面是Hash的文档:http://ruby-doc.org/core/classes/Hash.html


我有一个类似的问题,但是当我使用 entry["EntryId"] 时,我得到了 无法将字符串转换为整数(TypeError) 的错误。 - Sparkplug

3
每当我看到多维数组时,我就会想是否可以使用一个小型的类或结构体来简化和更容易理解,就像轻量级类一样。例如:
# define the struct
Thing = Struct.new( "Thing", :entry_id, :field_1, :date_created , :created_by)

directory = Hash.new     # create a hash to hold your things keyed by entry_id

# create your things and add them to the hash
thing = Thing.new(2, "National Life Group", "2010-07-30 11:00:14", "tristanoneil" )
directory[thing.entry_id] = thing

thing = Thing.new(3, "Barton Golf Club", "2010-07-30 11:00:14", "public" )
directory[thing.entry_id] = thing                    

thing = Thing.new(4, "PP&D Brochure Distribution", "2010-07-30 11:00:14", "public" )
directory[thing.entry_id] = thing

thing = Thing.new(5, "Prime Renovation Group, DreamMaker Bath & Kitchen", "2010-07-30 11:00:14", "public" )
directory[thing.entry_id] = thing


# then retrieve what you want from the hash
my_thing = directory[3]
puts my_thing.field_1

创建这样一个结构体来保存数据的优点是,您可以对每个项目进行任何操作 - 将它们放入数组、哈希表中,仍然可以通过object.fieldname符号访问每个单独的项目及其字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接