ruby-on-rails - 从循环中的变量创建散列

标签 ruby-on-rails arrays ruby hash

我想以哈希数组结束。

我从一组代码开始:

@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 变量,并且只返回最后一个循环的值。

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

最佳答案

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

但是,循环中的变量只是工作/临时变量,而不是实例变量。此外,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_object(Array 类包括 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 指出这一点!

关于ruby-on-rails - 从循环中的变量创建散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30711522/

相关文章:

ruby-on-rails - 我该如何解释这个 Rails/PostgreSQL 错误?

mysql - gem 安装 mysql 不起作用。但我能够连接到 mysql -u root -p

ruby - 在 Ruby 中通过 UPnP 打开路由器端口

ruby-on-rails - RoR 中的 View 和布局有什么区别?

ruby-on-rails - Rails 关注方法覆盖另一个关注方法不像普通模块那样工作

javascript - 幕后是否存在 JavaScript 中的数组/列表?

php - PropertyMappingFactory 类尝试使用 twig 获取数组的第一个元素时生成异常

arrays - Node.js 有没有办法在 JSON 响应中发送数组?

ruby-on-rails - 将 Square 与 Rails 项目集成

ruby-on-rails - 使用 Rspec should_receive 测试 Controller 是否正确调用对象上的方法