Ruby 比较数组中多个散列的值
我知道应该避免for循环,我想迭代数组的更好方法是Ruby 比较数组中多个散列的值,ruby,arrays,for-loop,hash,Ruby,Arrays,For Loop,Hash,我知道应该避免for循环,我想迭代数组的更好方法是 for i in 0..array.size-1 do puts array[i] end 做 但是如果我有一个散列数组,比如 array = [{:value0 => 1, :value1 => 0}, {:value0 => 2, :value1 => 1}, {:value0 => 1, :value1 => 2}] 并希望检查:value0在所有哈希中是否唯一。。直觉上我会做类似的事情 for
for i in 0..array.size-1 do
puts array[i]
end
做
但是如果我有一个散列数组,比如
array = [{:value0 => 1, :value1 => 0}, {:value0 => 2, :value1 => 1}, {:value0 => 1, :value1 => 2}]
并希望检查:value0在所有哈希中是否唯一。。直觉上我会做类似的事情
for i in 0..array.size-1 do
_value_buffer = array[i][:value0]
for j in i+1..array.size-1 do
if _value_buffer == array[j][:value0]
puts "whatever"
end
end
end
有更好的方法吗?以下是我的方法:
2.0.0p195 :001 > array = [{:value0 => 1, :value2 => 0}, {:value0 => 2, :value2 => 1}, {:value0 => 1, :value2 => 2}]
=> [{:value0=>1, :value2=>0}, {:value0=>2, :value2=>1}, {:value0=>1, :value2=>2}]
2.0.0p195 :002 > val0 = array.map { |hash| hash[:value0] }
=> [1, 2, 1]
2.0.0p195 :003 > puts val0.uniq == val0
false
=> nil
我将收集:value0的值,然后将它们与唯一值数组进行比较。以下是我将如何操作:
2.0.0p195 :001 > array = [{:value0 => 1, :value2 => 0}, {:value0 => 2, :value2 => 1}, {:value0 => 1, :value2 => 2}]
=> [{:value0=>1, :value2=>0}, {:value0=>2, :value2=>1}, {:value0=>1, :value2=>2}]
2.0.0p195 :002 > val0 = array.map { |hash| hash[:value0] }
=> [1, 2, 1]
2.0.0p195 :003 > puts val0.uniq == val0
false
=> nil
我会收集:value0的值,然后将它们与唯一值数组进行比较。为什么不直接获取所有有问题的值,看看它们是否唯一
!array.map { |h| h[:value0] }.uniq!
当没有重复项时返回nil为什么不获取所有有问题的值并查看它们是否唯一
!array.map { |h| h[:value0] }.uniq!
当没有重复项时返回nil正如Andrew Marshall所说,您可以使用uniq!,但用更简洁的方式:
!array.uniq!{|a| a[:value0]}
正如Andrew Marshall所说,您可以使用uniq!,但用更简洁的方式:
!array.uniq!{|a| a[:value0]}
您要1号的吗?还是数组的长度?这是一个很好的解决方案。@guy你说得对,但我将完全绕过它,以使解决方案保持为一个变量,并减少一行:。这非常聪明,我从未真正想过使用破坏性方法+1@andrewmarshall啊,好吧,编辑之前我有点困惑,因为你的答案,但这是非常整洁的-谢谢@我通常避免使用破坏性的方法,但我认为这没关系,因为它位于一个刚刚创建的功能数组上,无论如何都会被丢弃。您希望大小等于1吗?还是数组的长度?这是一个很好的解决方案。@guy你说得对,但我将完全绕过它,以使解决方案保持为一个变量,并减少一行:。这非常聪明,我从未真正想过使用破坏性方法+1@andrewmarshall啊,好吧,编辑之前我有点困惑,因为你的答案,但这是非常整洁的-谢谢@我通常避免使用破坏性的方法,但我认为这没关系,因为它是在一个刚刚创建的函数数组上,无论如何都会被丢弃。哦,顺便说一句,你永远不需要在Ruby中使用for。如果你真的需要索引,你可以使用或者,或者可能是0..array.size-1.times{| i |…}。我会记住的,谢谢!哦,顺便说一句,你永远不需要在Ruby中使用for。如果你真的需要索引,你可以使用或者,或者可能是0..array.size-1.times{| i |…}。我会记住的,谢谢!