Ruby Доступ к элементам массива - PullRequest
7 голосов
/ 02 октября 2010

У меня есть массив, который выглядит следующим образом.

[{"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 голосов
/ 02 октября 2010

Наличие фигурных скобок и хеш-розеток (=>) означает, что вы имеете дело с Ruby Hash, а не с массивом.

К счастью, извлекая значение (вещь справа от хеш -рокета)связанный с любым одним ключом (вещь слева от hashrocket) - это кусок пирога с Hashes: все, что вам нужно сделать, это использовать оператор [].

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

Вот документация дляХеш: http://ruby -doc.org / core / classes / Hash.html

7 голосов
/ 02 октября 2010

Похоже, это массив хэшей. Предполагая, что это хранится в переменной как:

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 .

Если вы хотите обработать массив, вы можете использовать каждый: Этот код напечатает значение 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"]}"}
3 голосов
/ 02 октября 2010

Всякий раз, когда я вижу многомерные массивы, я задаюсь вопросом, нельзя ли сделать это проще и проще для понимания с помощью небольшого класса или структуры, которая похожа на легкий класс.

например,

# 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

Преимущество создания подобной структуры для хранения ваших данных состоит в том, что вы можете делать с каждым элементом все, что захотите - помещать их в массивы, хэши и т. Д. И по-прежнему получать доступ к каждому отдельному элементу и его полям с помощью объектаобозначение .fieldname.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...