3

我有一些 JSON 被拉入并读入一个对象@items

[
 {
  {
    "id": "A",
    "description": "a_description_one"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "B",
    "description": "b_description_one"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "C",
    "description": "c_description_one"
    "value": some_alphanumeric_string
  }
 }, 
 {
  {
    "id": "C",
    "description": "c_description_3"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "A",
    "description": "a_description_3"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "B",
    "description": "b_description_3"
    "value": some_alphanumeric_string
  }
 }, 
 ...
] 

我的目标是在 HTML 中输出两个表格,如下所示:

 -----------------------------------------------------
|        A        |        B        |        C        |
|-----------------------------------------------------|
|a_description_one|b_description_one|c_description_one|
|-----------------------------------------------------|
|a_description_two|b_description_two|c_description_two|
|-----------------------------------------------------|
|a_description_3  |b_description_3  |c_description_3  |
 -----------------------------------------------------

第二张桌子:

 ----------------------------------------------------
|  C value  | C description  |  Count       | Change |
|----------------------------------------------------|
|some string|it's description|times appeared| change |
 ----------------------------------------------------

虽然第一个表相当简单,但由于我不知道描述符的顺序,我无法找到对其进行编码的好方法。因此,我有:

<table> 
  <thead> 
    <tr>
      <th>a</th>
      ...
    </tr>
  </thead>
  <tbody> 
    <% for item in @items %>
      <% for portion in item %> 
        <% if portion[0]["id"] == "A" %> 
           <% a = portion[0] %>
        <% end %>
      ...
      <% end %> 
      <tr> 
        <td><%= a["description"].to_s %></td>
        ...
      </tr> 
    <% end %>
  </tbody>
</table> 

这看起来很糟糕。

至于第二个表,我要做的就是查看所有 C 值,如果有多个具有相同 C 值的倍数,则将它们连接起来。我还想加载昨天的数据,我可以从服务器获取并拥有 as @items_old,并将具有相同值的项目数与昨天的数进行比较。我不知道该去哪里。

4

1 回答 1

1

听起来描述数组是乱序的,但你需要它们按顺序排列。因此,只需在遍历它们之前对数组进行排序。

<% for item in @items %>
  <% for portion in item.sort_by { |obj| obj['id'] } %> 
    <tr>
      <td><%= obj["description"].to_s %></td>
      ...
    </tr>
  <% end %>
<% end %>

或者,ruby 数组确实有一个Array#find方法,它接受一个块并在块返回时返回一个项目true。因此,如果您想真正明确地说明它,您可以这样做:

<% for item in @items %>
  <% for portion in item %> 
    <tr>
      <td><%= item.find { |obj| obj['id'] == 'A' }["description"].to_s %></td>
      <td><%= item.find { |obj| obj['id'] == 'B' }["description"].to_s %></td>
      <td><%= item.find { |obj| obj['id'] == 'C' }["description"].to_s %></td>
    </tr>
  <% end %>
<% end %>

但这开始变得很棘手。我强烈建议将该逻辑重构为一些辅助方法。这里的缺点是你曾经有一个D在那里你突然有很多代码要改变。只需遍历已排序的数组,您就不必真正关心其中有多少,这取决于您在做什么,这可能是好是坏。


最后,您可以将 ruby​​ 中的这些数据转换为您想要的格式。从这些数据中构建新的数组和散列,并将处理@items后的对象呈现给视图。或者甚至更好地将所有这些包装在一个类中,该类具有解析这些数据的方法,然后为其提供一个简单的接口。

如果这些数据相当复杂,并且以多种不同的方式使用,这可能是最“正确”的方法,因为它封装了远离表示逻辑的数据逻辑。

class Descriptions
  def initialize(json)
    @data = JSON.parse(json)
  end

  def get_description(index, id)
    description_obj = @data[index].find do |obj|
      obj['id'] == id
    end

    description_obj['description'].to_s
  end
end

my_model = Descriptions.new(json)
my_model.get_description(0, 'A')
于 2012-07-25T00:30:58.137 回答