Har*_*oon 0 ruby arrays json ruby-on-rails
我正在创建一个字段数组
def create_fields fields
fields_list = []
fields.each do |field|
# puts "adding_field to array: #{field}"
field_def = { field: field, data: { type: 'Text', description: '' } }
fields_list.push field_def
end
fields_list
end
Run Code Online (Sandbox Code Playgroud)
将fields_list被设置为一个jsonb场.
让我们说我传入
create_fields ['Ford', 'BMW', 'Fiat']
Run Code Online (Sandbox Code Playgroud)
Json结果是一个数组:
{"field"=>"Ford", "data"=>{"type"=>"Text", "description"=>""}}
{"field"=>"BMW", "data"=>{"type"=>"Text", "description"=>""}}
{"field"=>"Fiat", "data"=>{"type"=>"Text", "description"=>""}}
Run Code Online (Sandbox Code Playgroud)
如何从json数组访问'Ford'?我是否错误地创建了数组?有没有更好的方法来创建这个数组,以便我可以访问我想要的字段?
这个断言通过了 assert_equal(3, fields.count)
但是我想得到'福特'并检查它的属性,例如type ='Text',类型可以等于'Number'或者其他什么.
具有指定参数的create_fields方法的结果如下:
[
{:field=>"Ford", :data=>{:type=>"Text", :description=>""}},
{:field=>"BMW", :data=>{:type=>"Text", :description=>""}},
{:field=>"Fiat", :data=>{:type=>"Text", :description=>""}}
]
Run Code Online (Sandbox Code Playgroud)
这意味着如果您想要访问属于"Ford"的行,您需要搜索它,如:
2.3.1 :019 > arr.select{|e| e[:field] == "Ford" }
=> [{:field=>"Ford", :data=>{:type=>"Text", :description=>""}}]
2.3.1 :020 > arr.select{|e| e[:field] == "Ford" }[0][:data][:type]
=> "Text"
Run Code Online (Sandbox Code Playgroud)
这不是最佳的,因为您需要搜索数组O(n)而不是使用散列的优点.如果有例如:2"Ford"线,你将获得一个包含2个元素的数组,更难以处理字段值中的冲突.
如果您创建数组会更好:
def create_fields fields
fields_list = []
fields.each do |field|
# puts "adding_field to array: #{field}"
field_def = [field, { type: 'Text', description: '' } ]
fields_list.push field_def
end
Hash[fields_list]
end
Run Code Online (Sandbox Code Playgroud)
如果您选择此版本,则可以访问以下成员:
2.3.1 :072 > arr = create_fields ['Ford', 'BMW', 'Fiat']
=> {"Ford"=>{:type=>"Text", :description=>""}, "BMW"=>{:type=>"Text", :description=>""}, "Fiat"=>{:type=>"Text", :description=>""}}
2.3.1 :073 > arr["Ford"]
=> {:type=>"Text", :description=>""}
2.3.1 :074 > arr["Ford"][:type]
=> "Text"
Run Code Online (Sandbox Code Playgroud)
以上两个例子都是Ruby词典/哈希.如果你想从中创建一个JSON,你需要转换它:
2.3.1 :077 > require 'json'
=> true
2.3.1 :078 > arr.to_json
=> "{\"Ford\":{\"type\":\"Text\",\"description\":\"\"},\"BMW\":{\"type\":\"Text\",\"description\":\"\"},\"Fiat\":{\"type\":\"Text\",\"description\":\"\"}}"
Run Code Online (Sandbox Code Playgroud)