我有一个像这样的哈希数组
@data_records = [
{"user": "user1", "key1": "v1k1", ... , "keyN": "v1kN"},
{"user": "user2", "key1": "v2k1", ... , "keyN": "v2kN"},
{"user": "user3", "key1": "v3k1", ... , "keyN": "v3kN"},
{"user": "user1", "key1": "v4k1", ... , "keyN": "v4kN"},
{"user": "user1", "key1": "v5k1", ... , "keyN": "v5kN"},
{"user": "user4", "key1": "v6k1", ... , "keyN": "v6kN"},
]
如您所见,对于同一个用户,我可能有很多“记录”。例如,在上面的示例中,user1
有三个记录。
现在我需要根据这个哈希数组生成一个数组,其中的每个用户都有一个条目。我是说,我需要
[ "user1", "user2", "user3", "user4" ]
但不是
[ "user1", "user2", "user3", "user1", "user1", "user4" ].
我编写了以下代码,完成了这项工作:
def users_array
arr = Array.new
@data_records.each { |item| arr.push(item["user"]) if not arr.include?(item["user"])}
arr
end
但令我困扰的是我必须使用辅助变量 arr
才能工作。我确信使用 Array#map
方法有更短的方法。由于 Array#map
返回一个数组,它可能类似于
def users_array
@data_records.map { |item| item["user"] if ... }
end
问题是我不知道如何在 block 中提及我使用 Array#map
创建的数组。我相信它可能是这样的
def users_array
@data_records.map { |item| item["user"] if not this.include?(item["user"]) }
end
但这当然行不通。
谁能告诉我是否有办法做到这一点?
编辑
是的,我可以使用 Array#uniq
来做到这一点。但后来我重新表述了这个问题:有没有办法在 map block 中引用 map
创建的隐式数组?
最佳答案
对我来说,最好的方法是 each_with_object
,并使用 Set
而不是数组来收集用户名。
require 'set'
def users_array
@data_records.each_with_object(Set.new) do |item, set|
set << item[:user]
end
end
关于arrays - 在 Ruby 中向没有辅助变量的数组添加唯一元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39216741/