【问题标题】:How to iterate over nested items如何迭代嵌套项
【发布时间】:2017-03-22 11:16:25
【问题描述】:

我有这个 HTML:

<div class="date">
  <h3 class="date-title">Today</h3>

  <div class="film">
    <img class="poster" src="film1" />
      <h4 class="title">Film 1</h4>
    <ul class="session-times">
      <li>
        <a href="#">
          <time>12:00 PM</time>
        </a>
      </li>
    </ul>
  </div><!-- /.film -->

  <div class="film">
    <img class="poster" src="film2" />
      <h4 class="title">Film 2</h4>
    <ul class="session-times">
      <li>
        <a href="#">
          <time>3:00 PM</time>
        </a>
      </li>
    </ul>
  </div><!-- /.film -->

  <div class="film">
    <img class="poster" src="film3" />
      <h4 class="title">Film 3</h4>
    <ul class="session-times">
      <li>
        <a href="#">
          <time>6:00 PM</time>
        </a>
      </li>
    </ul>
  </div><!-- /.film -->
</div><!-- /.date -->

<div class="date">
  <h3 class="date-title">Tomorrow</h3>

  <div class="film">
    <img class="poster" src="film1" />
      <h4 class="title">Film 1</h4>
    <ul class="session-times">
      <li>
        <a href="#">
          <time>2:00 PM</time>
        </a>
      </li>
    </ul>
  </div><!-- /.film -->

  <div class="film">
    <img class="poster" src="film2" />
      <h4 class="title">Film 2</h4>
    <ul class="session-times">
      <li>
        <a href="#">
          <time>5:00 PM</time>
        </a>
      </li>
    </ul>
  </div><!-- /.film -->

  <div class="film">
    <img class="poster" src="film3" />
      <h4 class="title">Film 3</h4>
    <ul class="session-times">
      <li>
        <a href="#">
          <time>8:00 PM</time>
        </a>
      </li>
    </ul>
  </div><!-- /.film -->
</div><!-- /.date -->

我正在使用这个 Ruby 代码提取数据:

nokogiri_object.css('.date').each do |d|
  date = d.css('.date-title').text
  dates.push(date: date)
  d.css('.film').each do |film|
    title = film.css('.title')
    title_en = title.text.strip
    time = film.css('.session-times/li/a/time').text
  end
end

这给了我:

[
  {
    "date": "Today"
  },
  {
    "date": "Tomorrow"
  }
]

但我想在每个 .film 部分循环遍历三部电影 n 次,并将它们包含在输出中的每个日期下,所以它应该看起来更像这样:

[
  {
    "Today": {
      "films": [
        {
          "film": "Film1",
          "time": "12:00 PM"
        },
        {
          "film": "Film2",
          "time": "15:00 PM"
        },
        {
          "film": "Film3",
          "time": "6:00 PM"
        }
      ]
  },
  {
    "Tomorrow": {
      "films": [
        {
          "film": "Film1",
          "time": "14:00 PM"
        },
        {
          "film": "Film2",
          "time": "5:00 PM"
        },
        {
          "film": "Film3",
          "time": "8:00 PM"
        }
      ]
  },

我不知道在嵌套循环中的何处构建我的数组。

【问题讨论】:

    标签: arrays json ruby loops nokogiri


    【解决方案1】:

    这里的想法是首先找到类date 的节点(Nokogiri 节点的数组)。并将这个数组(使用map 方法)转换成你想要的结构。结果将是一个哈希数组(因为map)(因为这是我在外部map 中返回的)。要在任何哈希中创建您想要的结构,我使用相同的概念:使用 css 方法和 map 查找 nokogiri 节点,每个结果都是您想要的。

     date_nodes = nokogiri_object.css('.date')
     date_nodes.map do |date| 
       { 
         date.css('.date-title').text => { 
           "films" => date.css('.film').map do |film| 
             { 
               "film" => film.css('img.poster').attr('src').value, 
               "time" => film.css('time').text 
             }
           end 
         }
       }  
     end
     => [{"Today"=>{
       "films"=>[
         {"film"=>"film1", "time"=>"12:00 PM"}, 
         {"film"=>"film2", "time"=>"3:00 PM"}, 
         {"film"=>"film3", "time"=>"6:00 PM"}]}}, 
       {"Tomorrow"=>{
       "films"=>[
         {"film"=>"film1", "time"=>"2:00 PM"}, 
         {"film"=>"film2", "time"=>"5:00 PM"}, 
         {"film"=>"film3", "time"=>"8:00 PM"}]}}
      ] 
    

    【讨论】:

    • 与其扔掉代码,还提供代码作用的解释。我们的想法是教育,而不仅仅是提供解决方案。这就是给某人一条鱼或教他们钓鱼的区别。
    • 我不认为作者看不懂我的代码。我认为通常初学者/非专家很难思考如何解决问题,但向他们展示解决方案并不意味着他们无法理解解决方案
    • 如果作者愿意,可以随时询问细节或解释!
    • 这里的答案适用于所有来这里寻求解决方案的人,而不是严格针对 OP,并且不鼓励仅使用代码的答案。
    • 作者没有要求解释理论概念,他想要这个代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2023-03-26
    • 2014-10-22
    • 2013-03-16
    相关资源
    最近更新 更多