4

数组示例

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

想要的结果

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

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

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

是否可以用一个循环来做到这一点?

4

2 回答 2

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"

但是,这只是学术上的事情,因为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)
于 2013-10-01T14:23:44.297 回答
1

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

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

这是另一个:

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

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

于 2013-10-02T03:48:23.213 回答