我有以下数组:
["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]
我从redis获取此数组,我需要迭代并访问id和name键。我真的需要在每次迭代中调用JSON.parse吗?
如何迭代和显示数据?
答案 0 :(得分:1)
首先,循环没有错:
arr = ["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]
arr.map {|raw| JSON.parse(raw) }
现在,如果出于任何原因你想避免循环,这里有一些有趣的选择:
arr = ["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]
JSON.parse "[#{arr.join(",")}]"
所以:用“,”加入数组,创建一个我们放在“[]”之间的字符串 - 这会将您的JSON编码值列表转换为单个JSON编码数组。
这再说一遍 - 循环没有错。
答案 1 :(得分:0)
关于你的问题,如果你需要用地图方法做到这一点,你已经在评论和马丁的替代方案中得到了答案。
这是一种将逻辑与您的观点分开的方法,如Sergio建议
控制器,模型或帮助文件中的某处
class Visitor
require 'json'
def initialize string
hash = JSON.parse(string)
@id = hash["id"]
@name = hash["name"]
end
def to_s
"#{@id}: #{@name}"
end
end
class Visitors
include Enumerable
@@visitors = []
def initialize array
array.map{|visitor| @@visitors << Visitor.new(visitor)}
end
def each
@@visitors.map{|visitor| yield visitor}
end
end
array = ["{\"id\":1,\"name\":\"A\"}", "{\"id\":20,\"name\":\"B\"}"]
visitors = Visitors.new(array)
在你看来
visitors.each do |visitor|
<%=visitor%>
end
# 1: A
# 20: B