HAML .each函数用于变量

时间:2018-08-30 21:46:49

标签: html arrays ruby list haml

我大约有30多个变量,其中包含一个数组,数组中包含多个字符串。

1个变量= 1个数组。

我想知道是否有可能创建一个包含所有变量名称的新变量,以便我可以遍历它们。

例如:

  1. 这些是单个数组:

    - @a = ["a","b","c","d","d"];
    - @b = ["a","b","c","c","d"];
    - @c = ["a","b","c","d"];
    
  2. 现在我想在单独的变量中获得所有唯一和重复的字符串,像这样:

    - @x_uniq = @a.uniq
    - @x_dup = @a.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.select{ |k,v| v > 1 }.keys 
    ...
    - @x_uniq = @b.uniq
    - @x_dup = @b.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.select{ |k,v| v > 1 }.keys 
    ...
    - @x_uniq = @c.uniq
    - @x_dup = @c.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.select{ |k,v| v > 1 }.keys 
    
  3. 这是我使用每个x_uniq和x_dup变量的方式:

    - @x_uniq = @a.uniq
    - @x_dup = @a.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.select{ |k,v| v > 1 }.keys 
    
    %ul.list-inline
     - @x_uniq.each do |x|
       %li            
         %i{:class=>"fas fa-#{x} fa-2x"}
         %span.f6 #{x}                      
     - @x_dup.each do |x|
       %li            
         %i{:class=>"fas fa-#{x} fa-2x"}
         %span.f6 #{x} 
    
  4. 如果我有30个带有数组的变量,则需要分别为每个变量做一个.each()循环。我想知道,如果有人知道一种方法来遍历包含不同数据的30个x_uniq和x_dup变量

我当时正在考虑创建一个包含所有3个变量的变量。像这样(顺便说一句,我不知道变量@d是否正确):

- @d = [@a,@b,@c];

我接下来要做的是遍历@d变量,以获取各个变量及其内容。 问题是我不知道如何遍历@d变量。

有人可以解决我的问题吗?还是解决此问题的新方法?

谢谢。

1 个答案:

答案 0 :(得分:2)

不要创建其他不相关的变量。始终尝试从操纵结构的角度考虑Ruby代码:

- @data = { a: ["a","b","c","d","d"], b: ["a","b","c","c","d"], c: ["a","b","c","d"] }

然后定义一个方法,该方法采用该数组并返回中断的唯一数据和重复数据删除的数据:

def dedup_uniq(array)
  {
    uniq: array.uniq,
    dup: array.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.select { |k,v| v > 1 }.keys
  }
end

然后处理起来很容易,您只需进行迭代即可:

- @data = @data.map { |k, d| [ k, dedup_uniq(d) ] }.to_h

然后您具有所需的结构:

- @data.each do |k, d|
  %ul.list-inline
    - d[:uniq].each do |x|
    %li            
      %i{:class=>"fas fa-#{x} fa-2x"}
      %span.f6 #{x}                      
  - d[:dup].each do |x|
    %li            
      %i{:class=>"fas fa-#{x} fa-2x"}
      %span.f6 #{x}