我觉得这可以改善(红宝石的常见感觉).我正试图根据值unq一系列哈希.在这个例子中,我想要元素的颜色.苔藓和雪是冒名顶替者.
# remove unique array of hashes based on a hash value
a = [
{ :color => "blue", :name => "water" },
{ :color => "red", :name => "fire" },
{ :color => "white", :name => "wind" },
{ :color => "green", :name => "earth" },
{ :color => "green", :name => "moss" },
{ :color => "white", :name => "snow" }
]
# remove moss and snow
uniques = []
a.each_with_index do |r, i|
colors = uniques.collect {|e| e[:color]}
if !colors.include? r[:color]
uniques.push r
else
a[i] = nil
end
end
a.compact!
puts a
Run Code Online (Sandbox Code Playgroud)
这将打印
{:color=>"blue", :name=>"water"}
{:color=>"red", :name=>"fire"}
{:color=>"white", :name=>"wind"}
{:color=>"green", :name=>"earth"}
Run Code Online (Sandbox Code Playgroud)
这是"正确的",但我觉得这是过分的.我对.map .inject的体验是有限的,那些先进的技术让我望而却步.如果有人可以重新考虑这一点,那么它可能有助于我理解另一种简洁技巧.
我会使用Array reject或select方法:
require 'pp'
a = [
{ :color => "blue", :name => "water" },
{ :color => "red", :name => "fire" },
{ :color => "white", :name => "wind" },
{ :color => "green", :name => "earth" },
{ :color => "green", :name => "moss" },
{ :color => "white", :name => "snow" }
]
pp a.reject{ |h| %w[moss snow].include?( h[:name]) }
# >> [{:color=>"blue", :name=>"water"},
# >> {:color=>"red", :name=>"fire"},
# >> {:color=>"white", :name=>"wind"},
# >> {:color=>"green", :name=>"earth"}]
Run Code Online (Sandbox Code Playgroud)
或者你可以对它以及select你想要保留的东西持积极态度:
pp a.select{ |h| %w[water fire wind earth].include?( h[:name] ) }
# >> [{:color=>"blue", :name=>"water"},
# >> {:color=>"red", :name=>"fire"},
# >> {:color=>"white", :name=>"wind"},
# >> {:color=>"green", :name=>"earth"}]
Run Code Online (Sandbox Code Playgroud)
你并没有真正处理哈希,它是一个恰好包含哈希的数组,所以不要让它们混淆你.数组方法喜欢reject并且select是过滤掉不需要的或保持想要的元素的核心方法.
在你的代码示例中,你忽略了你的目标:你想要的元素,拒绝"苔藓"和"雪",这些都是非元素.过滤掉非元素,并在散列中留下正确/真实的元素.从那里你可以提取正确的颜色.
使用时要注意的另一个问题uniq是位置,换句话说,它寻找第一个唯一值并拒绝后续值.这在您的代码中并不明显,因为您的数组始终与您测试的顺序相同.如果你拖了订单虽然......:
2.times do
pp a.shuffle.uniq{ |h| h[:color] }
end
Run Code Online (Sandbox Code Playgroud)
通过#1 ...
# [{:color=>"red", :name=>"fire"},
# {:color=>"white", :name=>"wind"},
# {:color=>"green", :name=>"moss"},
# {:color=>"blue", :name=>"water"}]
Run Code Online (Sandbox Code Playgroud)
通过#2 ...
# [{:color=>"green", :name=>"earth"},
# {:color=>"blue", :name=>"water"},
# {:color=>"red", :name=>"fire"},
# {:color=>"white", :name=>"snow"}]
Run Code Online (Sandbox Code Playgroud)
突然间,我们看到"苔藓"和"雪"都隐藏在结果中,即使颜色是独特的.这些都是你需要注意的微妙问题.
| 归档时间: |
|
| 查看次数: |
28076 次 |
| 最近记录: |