【问题标题】:How to access an Array containing hash-like objects如何访问包含类似哈希对象的数组
【发布时间】:2016-06-17 23:28:43
【问题描述】:

我从一个 API 收到一个数组,由于缺少更好的短语,该数组似乎包含对象样式表示法。

由于它是一个数组,我显然无法通过键或值访问它。在这个特定的对象类型中,我没有看到允许我将其转换为散列或 JSON,然后再转换为散列的方法。

将其转换为可以通过键和值访问数据的哈希的最合适方法是什么?

输出:

 [#<ObjectType::ObjectRef:0x30f2862
 @_ref="record:full/data/location/setting/partition",
 @configured=false,
 @name="John Doe",
 @addr="10.10.10.10">]

或者,如果可以将其转换为具有多个元素的数组(而不是一个大块的元素),我可以将其解析为 CSV 并在 Ruby 之外进行过滤。新数组中的元素将包含“值”(例如 false、“John Doe”、“10.10.10.10)。

【问题讨论】:

  • 请阅读“minimal reproducible example”。我们需要查看您尝试解决此问题的代码。您从 API 收到的“输出”部分是什么?您如何查看数据?
  • 是的,输出是API返回的数组。我使用pretty print 打印了该数据,但 variable.inspect 会返回相同的内容。我一直想问你:当我真的没有要分享的代码时,我如何提供一个满足最小、完整和可验证的问题。例如,我知道我不能使用数组以键/值对的形式访问该数据。我可以证明该数组没有任何方法可以做到这一点,但这无济于事。我可以尝试在= 上进行拆分,但这很做作。尝试为未来的 SO 用户提出好的问题。
  • 您显示的输出几乎可以肯定是具有单个元素的普通数组。所以第一步是obj = output[0]。在那之后,我愿意打赌obj.nameobj.addr 等会正常工作。
  • 如果您想将其转换为哈希值,您必须手动完成,除非您使用的库为此提供了方法(就像 ActiveRecord 对 attributes 所做的那样)。
  • 我很确定你在某处定义了ObjectType::ObjectRef。也许它是一颗宝石。所以,你可以做下一个:output.first._ref。请务必提供您正在使用的 gem 或产生该输出的代码。

标签: ruby object-notation


【解决方案1】:

试试这个:

array # =>  [#<ObjectType::ObjectRef:0x30f2862
             @_ref="record:full/data/location/setting/partition",
             @configured=false,
             @name="John Doe",
             @addr="10.10.10.10">]
array.map { |a| {configured: a.configured, name: a.name, addr: a.addr} }

# or if you can't access the instance variables
array.map do |a|
  {
    configured: a.instance_variable_get(:@configured), 
    name: a.instance_variable_get(:@name), 
    addr: a.instance_variable_get(:@addr)
  }
end # => [{configured: false, name: "John Doe", addr: "10.10.10.10"}]

# and if you want an array
array.map do |a|
  [
    a.instance_variable_get(:@configured), 
    a.instance_variable_get(:@name), 
    a.instance_variable_get(:@addr)
  ]
end # => [[false, "John Doe", "10.10.10.10"]]

【讨论】:

  • 谢谢,这对于无法使用直接方法访问数据时很有帮助。不过就我而言,上面的人是正确的——我只是不明白如何访问我正在使用的对象。
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2010-10-24
相关资源
最近更新 更多