Ruby数组映射并在一个循环中连接

时间:2013-10-01 14:20:09

标签: ruby arrays theory

数组示例

[
 [
   "Francis",
   "Chartrand",
   "email@email.com"
 ],
 [
   "Francis",
   "Chartrand",
   "second_email@email.com"
 ],...
]

想要的结果

"email@email.com, second_email@email.com, ..."

我的解决方案(两个循环)

array.map{|a| a[2]}.join(", ")

是否可以通过一个循环执行此操作?

2 个答案:

答案 0 :(得分:5)

使用Enumerable#inject我们可以在一个循环中完成任务:

a = [
  ["Francis", "Chartrand", "email@email.com"],
  ["Francis", "Chartrand", "second_email@email.com"]
]
a.inject(nil) {|str, arr| str ? (str << ', ' << arr[2]) : arr[2].dup}
#=> "email@email.com, second_email@email.com"

但是,这只是学术性的事情,因为map / join更快,更易读。见this benchmark

             user   system    total       real
map/join 1.440000 0.000000 1.440000 ( 1.441858)
inject   2.220000 0.000000 2.220000 ( 2.234554)

答案 1 :(得分:0)

这是一种方法,但可能不会特别快。

s = ''          
array.flatten.each_slice(3) {|e| s += e.last + ', '} 
s.chop.chop

这是另一个:

array.transpose[2].join(', ')

我假设您想要整个阵列的单个电子邮件地址字符串。