【问题标题】:How to loop through selected items in yaml sequence using haml如何使用haml遍历yaml序列中的选定项目
【发布时间】:2016-04-02 07:44:18
【问题描述】:

我有一个 yaml 序列,其中包含我想在某些地方完整循环但在其他地方只部分循环的推荐。简而言之,如何在haml中选择并循环yaml序列中的特定项目?

下面的例子被剥离了

我的 yaml 数据

# testimonials.yml

-
  name: 'Jill'
  quote: 'An unbelievable experience!'
  photo: 'jill.jpg'
-
  name: 'Jack'
  quote: 'I unreservedly recommend this programme'
  photo: 'jack.jpg'
-
  # ... etc 

一个基本的工作haml循环

-# about.html.haml

- data.testimonials.each do |testimonial|
  %div
    %img{ :src => testimonial.photo }
    %p= testimonial.name
    %p= testimonial.quote

我正在努力实现的目标

但是,在另一部分中,我只想遍历序列中的特定推荐,例如。 [0, 4, 7]。在我的天真中,我认为这类似于在循环之外选择特定的序列项,例如。 %p= data.testimonials[0].name,像这样:

- data.testimonials[0, 4, 7].each do |testimonial|
  %div
    %img{ :src => testimonial.photo }
    %p= testimonial.name
    %p= testimonial.quote

但是...这会返回 “参数数量错误” 错误,因为该方法似乎只接受序列/数组中的单个范围,例如 testimonials[4, 7](或 [4..7]2..2 等)。

问题

有没有办法将多个范围传递到这个循环中,例如。 [0..2 && 4..7](这不起作用,但你明白我的意思)?或者,这甚至是实现这一结果的推荐方式吗?也就是说,是否有一种标准且更有效的方法来选择和循环 yaml 序列中的特定项目(或范围)?

注意

我感觉select方法in this post(贴在下面)包含了答案...但我可能是错的,我不知道如何使用它...

选择
(要避免的别名:find_all)
当您需要过滤(即“选择”)多个值时非常有用。
[1, 2, 3, 4].select { |e| e % 2 == 0 } # returns [2, 4]

为了测试,我尝试将上面的内容翻译成- data.testimonials.select do |testimonial| testimonial == 1,它只返回整个序列,以及- data.testimonial.select {|testimonial| testimonial == 1},它返回一个语法错误......

【问题讨论】:

    标签: ruby yaml haml


    【解决方案1】:

    你也可以用这个Array#values_at

    例如。

    - data.testimonials.values_at(0, 4, 7).each do |testimonial|
      %div
        %img{ :src => "#{testimonial.photo}" }
        %p= testimonial.name
        %p= testimonial.quote
    

    【讨论】:

    • 这也有效。我还没有遇到values_at。这只是上述两个答案的替代方案还是在某种程度上有益?我可以看到它只对应于“整数索引或范围”,这似乎适合 yaml 序列项,因为它们只是
    • @eagobe values_at 的好处是您将只获得给定索引的数组,这样您就不需要遍历数组的所有项目,而在其他答案中,整个数组将遍历并且它将检查每个元素的给定条件。
    【解决方案2】:

    使用each_with_index

    - data.testimonials.each_with_index do |testimonial, index|
      - if [0, 4, 7].include? index
        %div
          %img{ :src => testimonial.photo }
          %p= testimonial.name
          %p= testimonial.quote
    

    您可以使用 Array#values_at,它将提取给定索引号的值并仅循环这些值,而不是遍历所有元素。 例如:

    > array = ["a", "b", "c", "d", "e", "f", "g", "h"] 
    > array.values_at(0, 4, 7)
    #=> ["a", "e", "h"]
    

    【讨论】:

    • 优秀。完美运行
    • @eagobe : 很高兴为您提供帮助
    【解决方案3】:

    使用 each_with_index 来传递元素及其索引,然后在块中执行 if [2, 6, 9].include?检查索引

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 2012-02-25
      • 2010-11-19
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多