2012-07-24 128 views
1

我有一些看起来像这样的JSON。我将它存储并读入一个对象@items。用Ruby on Rails显示对象

[ 
{ 
    { 
    "id": "A", 
    "description": "a_description" 
    }, 
    { 
    "id": "B", 
    "description": "b_description" 
    } 
}, 
{ 
    { 
    "id": "A", 
    "description": "a_description" 
    }, 
    { 
    "id": "B", 
    "description": "b_description" 
    } 
} 
] 

我的目标是具有两列,一个标记为A和其他标记为B,其中每一行给出了“a_description”和“b_description”来显示的表。我不知道如何去做这件事。

+0

+1为您的用户名。我不明白你的问题。项目数组是用这个json填充的吗?或者你有一个JSON,你想填充items数组? – MurifoX 2012-07-24 17:55:08

+0

我有一个文件中的json。据我所知,当我在JSON中读取时,我得到了items数组。 – rapidash 2012-07-24 18:05:37

+0

它看起来像整个数组下面的第一个子水平也应该是一个数组[]不是哈希{}对吗? – Ron 2012-07-24 19:14:26

回答

2

啊,散列和数组问题的散列的醇”阵列。

为了解决你的“失灵”的问题你首先必须

{ 
    "id": "A", 
    "description": "foo" 
}, 
{ 
    "id": "B", 
    "description": "bar" 
} 

转化为{"A" : "foo", "B" : "bar" }

@new_items = @items.map do |item| 
    output = {} 
    item.each do |hash| 
    output.merge!(hash["id"] => hash["description"]) 
    end 
end 

然后@new_items变(故意呈现出的顺序,因为散列元素是不排序)

[ 
    { 
    "A": "a1_description", 
    "B": "b1_description" 
    }, 
    { 
    "B": "b2_description", 
    "A": "a2_description" 
    } 
] 

从那里,每行是一个简单的哈希,所以你可以取消引用价值,你需要根据在列,你就能加入。

@new_items.each do |item| 
    puts "#{item['A']} is paired with #{item['B']}" 
end 

键,当然也可以动态检索的,如果你不想硬编码“A”和“B”使用.keys

+0

我喜欢这个解决方案,但是如果物品有第三个ID“C”呢? – rapidash 2012-07-24 20:48:24

+0

它是一个已知的第三个ID,还是它是动态的或任意的?我用最后一行暗示了这一点,使用.keys方法。您可以类似地使用.values方法获取所有值的数组(因为它是散列值)。 – Ron 2012-07-26 22:22:19

2

像这样也许

<tr><th>A</th><th>B</th></tr> 
<% @items.each do |item| %> 
    <tr><td><%=item[0].description%></td><td><%=item[1].description%></td></tr> 
<% end %> 
+0

这是可行的,但它似乎有可能使数组项目失序 - 我需要检查id,否则可能会将项目列入错误的列。 – rapidash 2012-07-24 18:07:15

+0

是的 - 这是这个解决方案的确切问题 - 没有一个项目与它们应该匹配的列,并且它们最终不在哪个列中。 – rapidash 2012-07-24 18:19:16

+0

@rapidash,如果是这种情况。您需要按照您希望安排的方式解析数据。只需循环显示项目并按照您喜欢的方式重新构建它。 – 2012-07-24 18:22:41