【问题标题】:Create hash from variables in loop从循环中的变量创建哈希
【发布时间】:2015-06-08 14:14:20
【问题描述】:

我想得到一个哈希数组。

我从一组代码开始:

@codes = ['123', '456', '789']

我获取这些代码中的每一个并使用它们访问一个 API,它会返回我在循环中解析为变量的值,如下所示:

@codes.each do |x|
  @y = x.get_some_data
  @brand = @y[brand]
  @size = @y[size]
end

然后我想把这些数据放到一个哈希数组中

merged_array = []
final_hash = @codes.map{|code| {:code => code, :brand=> @brand, :size=> @size}
merged_array << final_hash

在一个完美的世界中,在merged_array 中得到如下所示的哈希:

 {:code => '123', :brand=> 'nike', :size=> 8 }
 {:code => '456', :brand=> 'adidas', :size=> 4 }
 {:code => '789', :brand=> 'converse', :size=> 10 }

但是当我运行我的脚本时,它会正确映射代码,但会覆盖@brand@size 变量并只返回最后一个循环的值。

不确定如何将我的所有变量放入哈希中?

【问题讨论】:

  • 而不是 codes.each 部分,只需将所有这些逻辑直接放在 map 方法中,也可能不需要实例变量,因为无论如何您都会丢弃这些数据。

标签: ruby-on-rails arrays ruby hash


【解决方案1】:

在您的代码示例中,变量都被声明为实例变量,因为它们的前缀为 @

但是,循环中的变量只是工作/临时变量,而不是实例变量。此外,x.get_some_data 可能不起作用,因为x 只是循环变量,包含456abc 等,而不是具有所需方法的对象。因此,以下代码应该会产生您想要的结果:

def get_data(codes)
  result = []
  codes.each do |code|
    y = get_some_data(code)
    result << {
      code: code,
      brand: y['brand'],
      size: y['size']
    }
  end
  result
end

这是一个非常冗长的例子;如果get_some_data 的返回值允许,你可以把整个逻辑放在map 中。

更优雅的版本将使用Enumerable#each_with_objectArray 类包括Enumereable):

def get_data(codes)
  codes.each_with_object([]) do |code, result|
    y = get_some_data(code)
    result << {
      code: code,
      brand: y['brand'],
      size: y['size']
    }
  end
end

感谢 Cary Swoveland 指出这一点!

【讨论】:

  • arghhhhh.. 答案确实是您的第一行.. 实例与临时变量.. 我将它们更改为方法/临时变量,现在一切正常.. 哇.. 轻松修复但我只是没看到!!非常感谢
  • 一个小建议:用codes.each_with_object([]) { |code, result|...代替开头的result = []和结尾的result
  • 好主意,@CarySwoveland,我已经相应地编辑了我的答案。
【解决方案2】:

这应该做的工作

@codes.map{|code| {:code => code, :brand => code.get_some_data['brand'], code.get_some_data['size']}}

但是,我真的不确定 String.get_some_data 会给你什么。例如:-'123'.get_some_data['brand']

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2015-08-22
    • 2012-06-01
    • 1970-01-01
    • 2014-10-17
    • 2012-03-05
    • 2011-04-20
    • 2023-01-10
    • 2021-08-27
    相关资源
    最近更新 更多