如何从Hash键构建新的Ruby数组

时间:2016-01-06 17:37:53

标签: arrays ruby hash

我想从具有以下格式的哈希开始构建一个新数组:

HashConst = {[120,240] => 60, [240,480]=> 30} #Constant

我需要构建一个新数组并使用以下格式将值赋值给新常量:

[ [[120,240] ,1], [[240,480], 1] ]

我试过了:

NewArrayConst = HashConst.keys.each{ |res| [res, 1]}

但我改为

[ [120,240], [240,480] ]

我找到的解决方案如下:

  tempVar = []
  HashConst.keys.each_with_index{ |res,idx| tempVar [idx] = [res, 1]}
  NewArrayConst = tempVar 

任何人都知道更好的解决方案,并且可以解释为什么我无法从NewArrayConst = HashConst.keys.each{ |res| [res, 1]}得到我期望的输出。我正在使用2.2.2-p95

编辑:

正如许多人指出Hash var名称错误且具有误导性,我已经更新了以避免混淆

3 个答案:

答案 0 :(得分:5)

您需要使用map代替each

Array#each方法不返回块中执行的代码的结果,而是返回调用each的数组,在您的情况下是hash.keys的值}。

Array#map将块返回的值收集到数组中。

hash = {[120,240] => 60, [240,480]=> 30}
p array = hash.keys.map{ |res| [res, 1]}
#=> [[[120, 240], 1], [[240, 480], 1]]

注意:不要将变量命名为Hash,因为它已经是Ruby中的一个众所周知的类。如果需要,请使用小写hash。另外,请避免使用NewArrayConst等变量名称的驼峰大小写,因为Ruby建议使用snake_case来命名变量 - 您可以参考Ruby Style Guide了解更多详细信息。

答案 1 :(得分:3)

h = {[120,240] => 60, [240,480]=> 30}
val = 1

h.keys.product([val])
  #=> [[[120, 240], 1], [[240, 480], 1]] 

答案 2 :(得分:-2)

你试过Hash.to_a吗?有时事情比你想象的容易。