Ruby - 从json数组访问值

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'或者其他什么.

akg*_*akg 5

具有指定参数的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)