arrays - 在 Ruby 中向没有辅助变量的数组添加唯一元素

标签 arrays ruby variables hash

我有一个像这样的哈希数组

@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/

相关文章:

Javascript:如何使变量 "private"仅用于当前递归层?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

arrays - 将元胞数组中的 double 插入 MATLAB 中的向量

javascript - 如何使用 javascript 查找并记录数组中最长的重复数字序列

Ruby:如何增加一个可能为零的数字?

mysql - Rails - 如何通过多个 ids(数组)查询

ruby-on-rails - Geocoder 的手动模拟

PHP 阻止操作在刷新时再次发生

javascript - 如何使用 Javascript 排除不存在的 JSON 数据?

PHP数组到MYSQL数据库?