Vis*_*har -2 ruby arrays multidimensional-array
我有这个数组:
array = [["R.M", 20], ["R.U-CS", 3], ["R.M-TIC", 3], ["R.J.CONF", 20]]
Run Code Online (Sandbox Code Playgroud)
我想要sum数值,所以我使用以下方法将其转换为单个数组flatten:
array = array.flatten
#=> ["R.M", 20, "R.U-CS", 3, "R.M-TIC", 3, "R.J.CONF", 20]
Run Code Online (Sandbox Code Playgroud)
然后:
a = []
array.each do |r|
a << r if r.class == Fixnum
end
a
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我正在寻找一个更简单的解决方案,可能首先将数组转换为"唯一numeric"数组:
[20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)
Ste*_*fan 17
不是很明显,但您可以传递一个类或模块grep来选择它的实例:
array.grep(Integer)
#=> [20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)
要么
array.grep(Numeric)
#=> [20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)
或者grep_v为了排除其实例:
array.grep_v(String)
#=> [20, 3, 3, 20]
Run Code Online (Sandbox Code Playgroud)
这样做是因为grep使用===模式匹配.如果你传递一个类,它会调用Module#===(每个类都是一个模块),true如果该对象是接收者的一个实例,它将返回:
Integer === 20
#=> true
Integer === 'foo'
#=> false
Run Code Online (Sandbox Code Playgroud)
但是,您的实际问题可以更轻松地解决.给定这个数组:
array = [["R.M", 20], ["R.U-CS", 3], ["R.M-TIC", 3], ["R.J.CONF", 20]]
Run Code Online (Sandbox Code Playgroud)
假设第二个值始终是一个数字,您可以使用sum一个块:
array.sum { |string, number| number }
#=> 46
Run Code Online (Sandbox Code Playgroud)
或者对每个子数组的last值求和:(在这种情况下是相同的)
array.sum(&:last)
#=> 46
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |