首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象数组(从OpenStruct创建)转换为值数组

将对象数组(从OpenStruct创建)转换为值数组
EN

Stack Overflow用户
提问于 2018-10-01 22:53:05
回答 1查看 818关注 0票数 1

我正在学习ruby,我正在使用一个样本数据。我将下面的hash转换为一个对象数组,如下所示。

代码语言:javascript
复制
class Openstruct
  require 'JSON'
  require 'ostruct'

  HASH = {
    items: [
      {
        health: [
          {
            goal: [
              {
                activity: [
                  {
                    id: "1A"
                  },
                  {
                    id: "2A"
                  }
                ],
                id: "GA"
              }
            ],
            activity: [
              {
                id: "1B"
              },
              {
                id: "2B"
              }
            ],
            id: "GB"
          }
        ],
        goal: [
          {
            activity: [
              {
                id: "1C"
              },
              {
                id: "2C"
              },
            ],
            id: "3c"
          }
        ],
        createdAt: "2018-01-01",
        updatedAt: "2018-01-01",
        id: "DA"
      }
    ],
  }

  def self.all
    json = HASH.to_json
    JSON.parse(json, object_class: OpenStruct)
  end

end

上面的返回如下结果

代码语言:javascript
复制
#<OpenStruct items=
  [#<OpenStruct health=
      [#<OpenStruct goal=
        [#<OpenStruct activity=
          [#<OpenStruct id="1A">, #<OpenStruct id="2A">], id="GA">], 
          activity=[#<OpenStruct id="1B">, #<OpenStruct id="2B">], id="GB">], 
          goal=[#<OpenStruct activity=[#<OpenStruct id="1C">, #<OpenStruct id="2C">], id="3c">], 
          createdAt="2018-01-01", 
          updatedAt="2018-01-01", 
          id="DA">]>

但是,我希望将具有id的对象数组转换为id值的数组。例如[#<OpenStruct id="1A">, #<OpenStruct id="2A">] --> "1A“、"2A”。所以我想要的最终结果如下:

代码语言:javascript
复制
#<OpenStruct items=
  [#<OpenStruct health=
      [#<OpenStruct goal=
        [#<OpenStruct activity=
          ["1A","2A"], id="GA">], 
          activity=["1B", 2B"], id="GB">], 
          goal=[#<OpenStruct activity=["1C","2C"], id="3c">], 
          createdAt="2018-01-01", 
          updatedAt="2018-01-01", 
          id="DA">]>

有人知道怎么做吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-02 00:39:12

您必须递归地检查子节点,直到找到只有:id元素的OpenStruct。以下是示例数据的工作代码。

代码语言:javascript
复制
def self.convert_struct_id(os)
  # Get possible attributes of any open_struct
  attributes = os.to_h.keys

  # Only get id_value if :id is the only attribute of open_struct
  if attributes.length == 1 && attributes.first == :id
    id_value = os.send(:id)
    return id_value
  end

  # Iterate through attributes
  attributes.each do |attr|
    # Get child elements
    data = os.send(attr)
    case data
    when OpenStruct
      convert_struct_id(data)
    when Array
      # Recursively process for child node
      data.map! { |d| convert_struct_id(d) }
    end
  end
  return os
end

您的self.all方法将如下所示

代码语言:javascript
复制
def self.all
  json = HASH.to_json
  os = JSON.parse(json, object_class: OpenStruct)
  res = convert_struct_id(os)
end

结果:

代码语言:javascript
复制
=> #<OpenStruct items=[#<OpenStruct health=[#<OpenStruct goal=[#<OpenStruct activity=["1A", "2A"], id="GA">], activity=["1B", "2B"], id="GB">], goal=[#<OpenStruct activity=["1C", "2C"], id="3c">], createdAt="2018-01-01", updatedAt="2018-01-01", id="DA">]>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52593761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档