如何将数组的元素添加到另一个数组并删除重复项

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)

Dem*_*gus 5

在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