如何在Ruby中高效将对象数组转换为单一属性数组?
在Ruby中高效提取哈希数组的单一属性组成新数组
要从哈希数组中提取指定属性(比如你的例子里的email),最简洁且高效的方式是使用Ruby内置的map方法——这也是Ruby社区最常用的方案。
基础用法
先修正你示例中的数组细节(Ruby里用nil替代null,字符串需加引号):
arr = [ {name: 'hihihihi', phone: nil, email: 'test@test.com', position: nil}, {name: 'hi', phone: nil, email: 'test2@test.com', position: nil} ]
提取email属性的核心代码:
emails = arr.map { |hash| hash[:email] } # 输出: ["test@test.com", "test2@test.com"]
Ruby 2.7及以上版本支持编号参数,可以让代码更简洁:
emails = arr.map { _1[:email] }
效率说明
map是Ruby标准库中高度优化的迭代器,在官方Ruby实现(MRI)中底层由C代码实现,比手动用each循环收集元素的效率高很多——它能最小化Ruby层面的循环开销,直接完成数组转换。
处理缺失属性的场景
如果数组中存在没有email键的哈希,直接用map会得到nil值。如果需要过滤这些空值,推荐用Ruby 2.7+新增的filter_map(只遍历一次数组,比map加compact更高效):
arr_with_missing_email = [ {email: 'test@test.com'}, {name: 'no-email'}, {email: 'test2@test.com'} ] emails = arr_with_missing_email.filter_map { _1[:email] } # 输出: ["test@test.com", "test2@test.com"]
内容的提问来源于stack exchange,提问作者Gaia Tamir
相关产品推荐
相关产品推荐

