【问题标题】:Parsing array of hashes?解析哈希数组?
【发布时间】:2012-07-13 23:39:06
【问题描述】:

这是一个示例哈希(每个查询最多 10 个)

parsed_response = [{"id"=>3, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/mobile-4", "name"= >"Mobile", "type"=>"MarketTag"}, {"id"=>12, "pic"=>"/images/icons/market.png", "url"=>"https://angel .co/enterprise-software", "name"=>"Enterprise Software", "type"=>"MarketTag"}, {"id"=>10, "pic"=>"/images/icons/market.png ", "url"=>"https://angel.co/saas", "name"=>"SaaS", "type"=>"MarketTag"}, {"id"=>841, "pic"= >"/images/icons/market.png", "url"=>"https://angel.co/software", "name"=>"软件", "type"=>"MarketTag"}, {" id"=>263, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/restaurants-2", "name"=>"餐厅", "type"=>"MarketTag"}, {"id"=>376, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/productivity- software", "name"=>"Productivity Software", "type"=>"MarketTag"}, {"id"=>942, "pic"=>"/images/icons/market.png", "url" =>"https://angel.co/embedded-hardware-and-software", "name"=>"嵌入式硬件和软件", "type"=>"MarketTag"}, {"id"=>291, "图片"=>" /images/icons/market.png", "url"=>"https://angel.co/meeting-software", "name"=>"会议软件", "type"=>"MarketTag"}, { "id"=>13764, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co/hardware-software", "name"=>"硬件+软件", "type"=>"MarketTag"}, {"id"=>2983, "pic"=>"/images/icons/market.png", "url"=>"https://angel.co /software-compliance", "name"=>"软件合规性", "type"=>"MarketTag"}]

我在创建的 gem 中尝试了很多方法。

第一种方法是创建一个特殊的类并将每个数组元素映射到该类:

class IDSearch
  attr_accessor :id, :thumbnail, :url, :name, :type
  def initialize(the_hash)
    @id   = the_hash['id']
    @url  = the_hash['url']
    @pic  = the_hash['pic']
    @name = the_hash['name']
    @type = the_hash['type']
  end
end

我会根据尝试列出它们:

Attempt 1:
IDSearch.new(parsed_response)

Attempt 2:
parsed_response.map {|t| IDSearch.new(t)}

Attempt 3:
parsed_response.each do |hsh|
SimpleAngel::IDSearch.new(hsh)
end

Attempt 4:
10.times do |i|
  instance_variable_set "@response_#{i}", parsed_response[i]        
end

Attempt 5 (getting desperate)
@response0 = parsed_response[0]
@response1 = parsed_response[1]
@response2 = parsed_response[2]
@response3 = parsed_response[3]
@response4 = parsed_response[4]
@response5 = parsed_response[5]
@response6 = parsed_response[6]
@response7 = parsed_response[7]
@response8 = parsed_response[8]
@response9 = parsed_response[9]

Attempt6: (this time inside of a rails controller)

search_object = SimpleAngel::Search.new
responses = search_object.id_search(params[:query], params[:type])
responses.each_with_index do |response, i|
  u      = Idquery.new
  u.name = response[i]['name']
  u.id   = response[i]['id']
  u.url  = response[i]['url']
  u.type = response[i]['type']
  u.pic  = response[i]['pic']
  u.save
end

这些方法都没有产生可预测、连贯、可行的反应。

不仅仅是一个实际的解决方案,我正在寻找关于我的想法如何存在缺陷的线索。

【问题讨论】:

  • 尝试 2 对我来说似乎工作正常。你具体有什么问题?顺便说一句:attr_accessor 也应该称为pic,而不是thumbnail
  • 确实,sn-p 2 有效。我们能看到那个案例的错误吗?
  • 测试期间的错误是朗姆酒太多。尝试 2 是正确的。如果你们没有告诉我,我可能永远不会因为沮丧而想到这一点。谢谢。

标签: ruby-on-rails ruby parsing hash gem


【解决方案1】:

在 Attempt1 中,您期望 IDSearch.new 中的哈希值并实际传递一个数组。 如果你这样做:

parsed_response.each {|hash| p IDSearch.new(hash)}

效果很好。

@id=3, @url="https://angel.co/mobile-4", @pic="/images/icons/market.png", @name="Mobile", @type="MarketTag"

【讨论】:

    【解决方案2】:
    require 'ostruct'
    parsed_response.map {|resp| OpenStruct.new(resp)}
    

    消除了对特定类的需求。

    【讨论】:

    • 评论者是正确的,尝试 2 是正确的。但是谢谢你教会了我一些新东西。
    • 返回错误:“NoMethodError: #<:idsearch:0x000etc>的未定义方法'each'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多