我试过 uniq 函数在 Ruby 中不起作用

问题描述

我有

我想显示所有文章的唯一标签列表。

我尝试使用 .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 标签。你可以用很多其他的方式来写,但想法是一样的。