Ruby:使用嵌套数组编译具有类似第一项的值



我有一个Ruby嵌套数组,如下所示:

arr = [["Red", 2], ["Red", 1], ["Yellow", 0], ["Yellow", 2], ["Blue", 1]]

我正试图找到一种方法,将类似项目的数字(这是每个迷你数组中的第二个项目(相加,生成一个嵌套数组,如下所示:

[["Red", 3], ["Yellow", 2], ["Blue", 1]]

我试过循环和if语句,但我不知道该怎么做

对于非嵌套数组,您可以只使用if.includes?,但我不知道如何使用嵌套数组。

有没有Ruby奇才能指引我朝着正确的方向前进?

请注意,这不是一个数组,也不是有效的ruby

["Red", 3], ["Yellow", 2], ["Blue", 1]

无论如何,试试这个

arr.group_by { |color, amount| color }
.map { |k, color_arr| [k, color_arr.map(&:last).inject(:+)] }
=> [["Red", 3], ["Yellow", 2], ["Blue", 1]]

或从ruby 2.4.0及以上

arr.group_by { |color, amount| color }
.map { |k, color_arr| [k, color_arr.map(&:last).sum] }
arr.each_with_object(Hash.new(0)) {|(col,nbr),h| h[col] += nbr}.to_a
#=> [["Red", 3], ["Yellow", 2], ["Blue", 1]]

注意中间计算:

arr.each_with_object(Hash.new(0)) {|(col,nbr),h| h[col] += nbr}
#=> {"Red"=>3, "Yellow"=>2, "Blue"=>1}

请参见哈希::new。

最新更新