HAML .each функция для переменных - PullRequest
0 голосов
/ 31 августа 2018

У меня есть около 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 голосов
/ 31 августа 2018

Не создавайте груды не связанных между собой переменных. Всегда старайтесь думать о вашем 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}
...