如何将数据收集从哈希更改为数组



现在我正在从另一个URL获取数据...这是我的代码:

require 'rubygems'
    require 'nokogiri'
    html = page.body
    doc = Nokogiri::HTML(html)
    doc.encoding = 'utf-8'
    rows = doc.search('//table[@id = "MainContent_GridView1"]//tr')
      @details = rows.collect do |row|
          detail = {}
          [
            [:car, 'td[1]/text()'],
            [:article, 'td[2]/text()'],
            [:group, 'td[3]/text()'],
            [:price, 'td[4]/text()'],
          ].each do |name, xpath|
            detail[name] = row.at_xpath(xpath).to_s.strip
          end
          detail
      end
    @details  

我试图通过数组而不是哈希来进行。但是我遇到了很多错误...有什么想法吗?我需要另一种方法...

我也将数据(此结果哈希)设置在此处的另一辆车上:

oem_art = []
    @constr_num.each do |o|
      as_oem = get_from_as_oem(o.ARL_SEARCH_NUMBER)
      if as_oem.present?
        oem_art << as_oem
      end
    end    
    @oem_art = oem_art.to_a.uniq

您是否只想将哈希人更改为数组?如果是这样,只需在哈希上使用to_a方法。

hash = {:a => "something", :b => "something else"}
array = hash.to_a
array.inspect #=> [[:a, "something"], [:b, "something else"]]

看起来您正在寻找ruby中的hash.key之类的东西

Hash类不支持.key符号,默认情况下,OpenStruct从Hash创建对象,因此您可以使用点符号访问属性。总体而言,它基本上只是句法糖。

建议的代码(来自链接答案)

>> require 'ostruct'
=> []
>> foo = {'bar'=>'baz'}
=> {"bar"=>"baz"}
>> foo_obj = OpenStruct.new foo
=> #<OpenStruct bar="baz">
>> foo_obj.bar
=> "baz"

因此,在您的示例中,您可以做:

# Initialised somewhere
require 'ostruct'
DETAIL_INDICES = { 
  :car => 1,
  :article => 2,
  :group => 3,
  :price => 4,
}
# ** SNIP **
@details = rows.map do |row|
  DETAIL_INDICES.inject({}) do |h,(k,v)| 
    h.merge(k => row.at_xpath("td[#{v}]/text()").to_s.strip) 
  end
end.collect { |hash| OpenStruct.new hash }
@details.each do |item|
  puts item.car
end

当然,如果是一个问题,您可以合并地图(它们是相同的),但这只是基本语义差异的小分离,尽管我通常只使用map来保持一致性,因此请随时选择你自己:)

编辑 - 简化的编辑中的其他代码

@oem_art = @constr_num.select do |item|
  as_oem = get_from_as_oem(item.ARL_SEARCH_NUMBER)
  as_oem.present?
end
puts @oem_art.uniq

相关内容

  • 没有找到相关文章

最新更新