问题描述
我有:
我尝试使用 .uniq
函数,但它不起作用。
这是我的代码:
vars[:tags] = articles.map {|x| x[:tags]}.uniq.join(' ')
这导致:chris,scott mark,chris
想要的结果应该是:chris,scott
有什么帮助吗?谢谢!
解决方法
地图后面有一个嵌套数组。使用 Array#flatten
将其递归减少一级:
articles.map {|x| x[:tags]} #=> [["chris","mark","scott"],["mark","scott","chris"]]
articles.map {|x| x[:tags]}.flatten #=> ["chris","chris"]
这就是你想要的:
vars[:tags] = articles.map {|x| x[:tags]}.flatten.uniq.join(' ')
感谢 @Stefan,您还可以使用 Enumerable#flat_map
获得与 a.map {}.flatten
相同的结果,may even be faster:
vars[:tags] = articles.flat_map {|x| x[:tags]}.uniq.join(' ')
,
您只加入了每篇文章的 uniq 标签,但如果我知道您希望每篇文章集合都有 uniq,那么您应该这样做:
vars[:tags] = []
articles.each { |article| vars[:tags] += article[:tags] }
vars[:tags] = vars[:tags].uniq.join(' ')
这是了解您应该实现的基本想法:首先获取所有标签,然后获取 onlu uniq 标签。你可以用很多其他的方式来写,但想法是一样的。