我试图根据if语句找出如何分配列表中的特定元素。
这是列表:
@x = ["american", "assistive", "audio", "blind", "braille", "closed-captioning", "closed-captioning", "deaf", "low", "phone", "question-circle", "question-circle", "sign", "tty", "universal", "wheelchair"]
这是我的haml代码:
%ul.list-inline
- @x.each do |i|
- if i[0].length < i[1].length
%li
%i{:class=>"fas fa-#{i[0]} fa-2x"}
%span.f6 #{i[0]}
- else
%li
%i{:class=>"far fa-#{i[1]} fa-2x"}
%span.f6 #{i[1]}
我想做的是确定列表中每个字符串的长度,并将其与列表中下一个字符串的长度进行比较。
确定第二个字符串是重复的字符串后,它应该放在else语句下。
我面临的问题是,通过使用i [0],而不是列表中的第一个字符串,我得到了列表中每个字符串的第一个字母。
我不知道我使用长度的方式是否是解决此问题的最佳方法,因此,如果其他人有更好的解决方案,只要它能完成工作,我就会愿意。
我在想,如果我可以根据哪些元素是唯一的和哪些重复项来过滤列表中的元素,那么我可以相应地进行分配。
但是我该怎么做?
谢谢。
答案 0 :(得分:0)
- @x.each_cons(2) do |cur, nxt|
- if cur.length < nxt.to_s.length
...
- else
...
答案 1 :(得分:0)
要回答问题的第一部分,其中i[0]
或i[1]
返回单个字母而不是元素,请让我们检查您的代码:
@x.each do |i|
这里i
是元素。因此,在第一次迭代中,i
是'american'。因此,当您调用i[0]
时,它将返回字符串的第一个字符 a ,而i[1]
返回的字符串是 m ,并且它们的长度均为 1 。
相反,您应该像这样修改代码:
%ul.list-inline
- @x.each_cons(2) do |current, next|
- if current.length < next.length
%li
%i{:class=>"fas fa-#{current} fa-2x"}
%span.f6 #{current}
- else
%li
%i{:class=>"far fa-#{next} fa-2x"}
%span.f6 #{next}
关于问题的第二部分,您将@x
定义为:
@x = ["american", "assistive", "audio", "blind", "braille", "closed-captioning", "closed-captioning", "deaf", "low", "phone", "question-circle", "question-circle", "sign", "tty", "universal", "wheelchair"]
要获取唯一元素:
@x_uniq = @x.uniq
要获取重复项:
@x_dup = @x.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.select{ |k,v| v > 1 }.keys
返回
["closed-captioning", "question-circle"]
我认为,使用第二种方法过滤数据并使用它是比比较元素及其长度的更好的解决方案。
希望这会有所帮助。