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

Fra*_*and 3 ruby theory arrays

数组例子

[
 [
   "Francis",
   "Chartrand",
   "email@email.com"
 ],
 [
   "Francis",
   "Chartrand",
   "second_email@email.com"
 ],...
]
Run Code Online (Sandbox Code Playgroud)

想要结果

"email@email.com, second_email@email.com, ..."
Run Code Online (Sandbox Code Playgroud)

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

array.map{|a| a[2]}.join(", ")
Run Code Online (Sandbox Code Playgroud)

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

tes*_*ssi 6

使用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"
Run Code Online (Sandbox Code Playgroud)

但是,这只是一个学术性的东西,因为map/ join更快,更可读.看到这个基准:

             user   system    total       real
map/join 1.440000 0.000000 1.440000 ( 1.441858)
inject   2.220000 0.000000 2.220000 ( 2.234554)
Run Code Online (Sandbox Code Playgroud)

  • @FrancisChartrand当然,地图和连接不仅更快,而且更直接.这就是每个人都在告诉你的事情.但是既然你坚持不使用map和join,并且因为你坚持在一个循环中执行它,并且因为你没有提到问题的速度,这就是你得到的. (5认同)
  • @toro2k 好收获。修复了它(这使得代码看起来有点笨拙)。但无论如何我们都同意使用`map`/`join`,所以笨拙并不重要:) (2认同)