Seb*_*eki 1 ruby arrays ruby-on-rails
我正在尝试在rails上创建一个json文件,它具有特定格式,如下所示:
{"nodes":["1","2","3"],"edges":[["1","3"],["2","3"],["2","1"]]}
Run Code Online (Sandbox Code Playgroud)
我的模型中有一个方法如下:
def self.joinup(id)
c = Challenge.find(id)
result={}
user_ids = c.users.pluck(:id)
result["nodes"] = user_ids.collect(&:to_s)
result["edges"] = Relationship.where(follower_id: user_ids).map{|h| [h.follower_id.to_s, h.followed_id.to_s]}
result["nodes"] = result["nodes"]|result["edges"]
result
end
Run Code Online (Sandbox Code Playgroud)
这会产生:
{"nodes":["1","2","3","3","3"["4","5"],["5","6"]],"edges":[["4","5"],["5","6"]]}
Run Code Online (Sandbox Code Playgroud)
而我想要的是:
{"nodes":["1","2","3","4","5","6"],"edges":[["4","5"],["5","6"]]}
Run Code Online (Sandbox Code Playgroud)
在rails中你可以使用数组方法flatten,它返回一个具有一个维度的数组,就像这样
array = ["1", "2", "3", ["2", "3", "4"], "5"]
array.flatten #=> ["1", "2", "3", "2", "3", "4", "5"]
Run Code Online (Sandbox Code Playgroud)
之后,您可以使用uniq方法返回数组中的所有不同值,因此这将返回结果
array.flatten.uniq #=> ["1", "2", "3", "4", "5"]
Run Code Online (Sandbox Code Playgroud)
此外,此方法可以与bang(!)运算符一起使用,它使用返回值更改原始数组,因此它将是这样的
array.flatten!.uniq!
Run Code Online (Sandbox Code Playgroud)
希望它有所帮助:D