在ruby中向数组添加可变数量的哈希值

时间:2015-11-20 22:41:04

标签: ruby-on-rails arrays ruby loops hash

我有一系列哈希。一些哈希看起来像这样:

hash1 = 
{8=>#<BigDecimal:7f19980a1938,'0.3313035E5',18(27)>}

有些看起来像这样:

hash2 = 
{3=>#<BigDecimal:7f19980a0100,'0.416158182E5',18(27)>,
 6=>#<BigDecimal:7f1998083870,'0.451966284E5',18(27)>,
 7=>#<BigDecimal:7f1998083208,'0.487774386E5',18(27)>}

和其他人看起来像这样:

hash3 = 
{1 =>#<BigDecimal:7f1998066e78,'0.680865408E5',18(27)>,
 2 =>#<BigDecimal:7f1998066950,'0.680898708E5',18(27)>,
 3 =>#<BigDecimal:7f1998066428,'0.680932008E5',18(27)>,
 4 =>#<BigDecimal:7f1998065e60,'0.680965308E5',18(27)>,
 5 =>#<BigDecimal:7f19980658e8,'0.680998608E5',18(27)>,
 6 =>#<BigDecimal:7f1998065348,'0.681031908E5',18(27)>,
 7 =>#<BigDecimal:7f1998064998,'0.681065208E5',18(27)>,
 8 =>#<BigDecimal:7f1998064358,'0.681098508E5',18(27)>,
 9 =>#<BigDecimal:7f199805bb90,'0.681131808E5',18(27)>,
 10=>#<BigDecimal:7f199805b550,'0.681165108E5',18(27)>,
 11=>#<BigDecimal:7f199805afb0,'0.681198408E5',18(27)>,
 12=>#<BigDecimal:7f199805aa88,'0.681231708E5',18(27)>}

我想用这些哈希循环遍历数组,并确保每个哈希有12个键。如果散列具有n < 12个密钥,则应将12-n个密钥添加到散列中,即n+1n+2,...,n=12。所有这些添加的键都应该具有空字符串的值。

例如,hash1应该成为:

{1=>"", 2=>"", 3=>"", 4=>"", 5=>"", 6=>"", 7=>"",
 8=>#<BigDecimal:7f19980a1938, '0.3313035E5', 18(27)>,
 9=>"", 10=>"", 11=>"", 12=>""}

hash2应该成为:

{1=>"", 2=>"", 3=>#<BigDecimal:7f19980a0100,'0.416158182E5',18(27)>,
 4=>"", 5=>"", 6=>#<BigDecimal:7f1998083870,'0.451966284E5',18(27)>,
 7=>#<BigDecimal:7f1998083208,'0.487774386E5',18(27)>,
 8=>"", 9=>"", 10=>"", 11=>, 12=>""}

我正在尝试遍历数组以创建一个看起来像这样的表:

<table border="border">
  <thead>
    <th>
      Name
    </th>
    <th>
      January
    </th>
    <th>
      February
    </th>
    <th>
      March
    </th>
    <th>
      April
    </th>
    <th>
      May
    </th>
    <th>
      June
    </th>
    <th>
      July
    </th>
    <th>
      August
    </th>
    <th>
      September
    </th>
    <th>
      October
    </th>
    <th>
      November
    </th>
    <th>
      December
    </th>
  </thead>
  <tr>
    <th>Seed</th>
    <td>26.23</td>
    <td>25.23</td>
    <td>27.23</td>
    <td>25.43</td>
    <td>28.23</td>
    <td>25.23</td>
    <td>25.23</td>
    <td>25.23</td>
    <td>27.23</td>
    <td>27.23</td>
    <td>23.23</td>
    <td>255.23</td>
  </tr>
  <tr>
    <th>Planting</th>
    <td>26.23</td>
    <td>25.23</td>
    <td>26.23</td>
    <td>25.23</td>
    <td>27.23</td>
    <td>25.43</td>
    <td>28.23</td>
    <td>25.23</td>
    <td>27.23</td>
    <td>27.23</td>
    <td>23.23</td>
    <td>255.23</td>
  </tr>
</table>

你能告诉我怎么做或让我知道更好的方法吗?

编辑:

我编辑了上面的表格,以更好地反映我正在寻找的内容。

以下是我必须使用的内容:

hash4 =
{
  "seed" => {8 => # < BigDecimal: 389 c1e8, '0.3313035E5', 18(27) >
},
  "planting" => {8 => # < BigDecimal: 3896 fb8, '0.33936408E5', 18(27) >
},
  "tilling" => {8 => # < BigDecimal: 3896220, '0.35029368E5', 18(27) >
},
  "weed_spray" => {4 => # < BigDecimal: 38959 b0, '0.38035008E5', 18(27) >
},
  "fertilzer" => {3 => # < BigDecimal: 3894 c68, '0.416158182E5', 18(27) >,
                  6 => # < BigDecimal: 388 bde8, '0.451966284E5', 18(27) > ,
                  7 => # < BigDecimal: 388 aee8, '0.487774386E5', 18(27) >
                 },
  "water" => {12 => # < BigDecimal: 388 a420, '0.51116373E5', 18(27) >
},
  "power" => {1 => # < BigDecimal: 38895e8, '0.5150061675E5', 18(27) >,
              2 => # < BigDecimal: 3888828, '0.518848605E5', 18(27) >,
              3 => # < BigDecimal: 387 fb10, '0.5226910425E5', 18(27) >,
              4 => # < BigDecimal: 387e d78, '0.52653348E5', 18(27) >,
              5 => # < BigDecimal: 387 da68, '0.5303759175E5', 18(27) >,
              6 => # < BigDecimal: 387 cb90, '0.534218355E5', 18(27) >,
              7 => # < BigDecimal: 386 b7a0, '0.5380607925E5', 18(27) >,
              8 => # < BigDecimal: 3869 fb8, '0.54190323E5', 18(27) >,
              9 => # < BigDecimal: 3869158, '0.5457456675E5', 18(27) >,
              10 => # < BigDecimal: 3867808, '0.549588105E5', 18(27) > ,
              11 => # < BigDecimal: 3866 c50, '0.5534305425E5', 18(27) >,
              12 => # < BigDecimal: 3865 d78, '0.55727298E5', 18(27)>
             },
    "labor" => {11 => # < BigDecimal: 3864 a68, '0.55775115E5', 18(27) >
},
    "harvesting" => {5 => # < BigDecimal: 385 ff68, '0.56458215E5', 18(27) >,
                     6 => # < BigDecimal: 385 f5b8, '0.57141315E5', 18(27) >,
                     7 => # < BigDecimal: 385e ac8, '0.57824415E5', 18(27) >
                    },
    "loan_repay" => {1 => # < BigDecimal: 382 f318, '0.680865408E5', 18(27) >,
                     2 => # < BigDecimal: 382e918, '0.680898708E5', 18(27) >,
                     3 => # < BigDecimal: 382 ddd8, '0.680932008E5', 18(27) >,
                     4 => # < BigDecimal: 382 d428, '0.680965308E5', 18(27) >,
                     5 => # < BigDecimal: 382 caa0, '0.680998608E5', 18(27) >,
                     6 => # < BigDecimal: 3823 c20, '0.681031908E5', 18(27) >,    
                     7 => # < BigDecimal: 3823130, '0.681065208E5', 18(27) >,
                     8 => # < BigDecimal: 3821380, '0.681098508E5', 18(27) >,
                     9 => # < BigDecimal: 38204 d0, '0.681131808E5', 18(27) >,
                     10 => # < BigDecimal: 3813460, '0.681165108E5', 18(27) >,
                     11 => # < BigDecimal: 38122e0, '0.681198408E5', 18(27) >,
                     12 => # < BigDecimal: 38115 c0, '0.681231708E5', 18(27) >
   }

}

2 个答案:

答案 0 :(得分:1)

Just write a helper method like this, which accept your incomplete hash and return 12 key hash in proper order

def prepare_hash(incomplete_hash)
    sample_hash, result_hash = {}, {}
    (1..12).to_a.each do |val|
      sample_hash[val] = ""
    end
    sample_hash.each do |key, val| 
      result_hash[key] = incomplete_hash.has_key?(key) ? incomplete_hash[key] : val
    end
    puts result_hash
    result_hash
  end
prepare_hash(hash1) # => {1=>"", 2=>"", 3=>"", 4=>"", 5=>"", 6=>"", 7=>"", 8=>"<BigDecimal:7f19980a1938,'0.3313035E5',18(27)>", 9=>"", 10=>"", 11=>"", 12=>""}

答案 1 :(得分:0)

假设您的阵列名为&#34; ary&#34;

   ary = [{},{},{}]
   ary.each_with_index {|hash, index| puts "#{index} is missing params" if hash.count != 12}