2010-10-02 26 views
7

Tôi có một mảng trông như thế này.Ruby Accessing Array Elements

[{"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"} 
] 

Làm cách nào để chuyển tiếp qua mảng này để tôi chỉ định trường tôi muốn in ra và nhận giá trị, vì vậy tôi có thể làm điều gì đó tương tự.

puts EntryId.value 

Trả lời

7

Sự hiện diện của dấu ngoặc nhọn và băm (=>) có nghĩa là bạn đang xử lý Ruby Hash chứ không phải mảng.

May mắn thay, lấy giá trị (điều bên phải của hàm băm) được liên kết với bất kỳ khóa nào (điều bên trái của băm nhỏ) là một miếng bánh có Hashes: tất cả những gì bạn phải làm là sử dụng Nhà điều hành [].

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

Đây là tài liệu cho Hash: http://ruby-doc.org/core/classes/Hash.html

+0

Điều này hiệu quả. –

+0

Tôi có một vấn đề tương tự nhưng khi tôi sử dụng 'mục [" EntryId "]' Tôi get'can't chuyển đổi String thành Integer (TypeError) ' –

7

Dường như đây là một mảng băm. Giả sử điều này được lưu trữ trong một biến như vậy:

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

Các phần tử đơn lẻ của mảng có thể được truy cập bằng chỉ mục trong dấu ngoặc vuông. Giá trị của băm có thể được truy cập bằng khóa trong dấu ngoặc vuông. Ví dụ để có được giá trị của "Field1" của phần tử mảng thứ hai bạn sẽ sử dụng:

data[1]["Field1"] 

Bạn có thể lặp qua mảng một cách dễ dàng với các phương pháp quy định tại các Enum mixin.

Nếu bạn muốn xử lý mảng bạn có thể sử dụng mỗi: Mã này sẽ in giá trị của Id mục nhập cho mỗi phần tử trong mảng của bạn.

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

Dữ liệu này không cần lưu trữ trong biến để hoạt động. Bạn chỉ có thể truy cập mảng ẩn danh trực tiếp bằng các phương thức sau:

Ví dụ: điều này sẽ trả về một mảng chuỗi. Trong đó mỗi phần tử của mảng được trả về là một biến thể được định dạng của phần tử tương ứng trong mảng ban đầu.

[{"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

Bất cứ khi nào tôi nhìn thấy mảng đa chiều, tôi tự hỏi, nếu nó không thể được thực hiện đơn giản và dễ hiểu hơn với một lớp học nhỏ hoặc struct, đó là như một lớp học nhẹ.

ví dụ:

# 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 

Ưu điểm của việc tạo ra một cấu trúc như thế để giữ dữ liệu của bạn là bạn có thể làm bất cứ điều gì bạn muốn với từng hạng mục - đặt chúng vào mảng, băm, bất cứ điều gì, và vẫn truy cập vào từng hạng mục cá nhân và các lĩnh vực của mình bằng ký hiệu object.fieldname.

Các vấn đề liên quan