返回多维数组的特定索引,没有副作用

时间:2015-06-26 00:36:18

标签: arrays ruby

鉴于这个多维数组:

a = [ [0,'abc'], [1,'def'] ]

我想只返回键(其中键是子数组的索引0)和只返回值(其中值是子数组的索引1):

a.keys
# => [0,1]

a.values
# => ['abc','def']

我的解决方案是使用map返回一个集合并使用shift和pop返回正确的项目:

a.map(&:shift)
=> [0, 1] 
a.map(&:pop)
=> ["abc", "def"]

很棒,但后来我发现了副作用:

 a
 => [[], []] 

有没有办法获得我的功能,但没有副作用?

2 个答案:

答案 0 :(得分:5)

首先,将数组数组转换为Hash:

a = [ [0,'abc'], [1,'def'] ]
h = Hash[a]

然后获取键和值:

h.keys #=> [0, 1]
h.values # => ['abc', 'def']

您也可以更直接地获得相同的结果(如果子数组总是只有2个元素):

a = [ [0,'abc'], [1,'def'] ]
a.map(&:first) # => [0, 1]
a.map(&:last)  # => ['abc', 'def']

答案 1 :(得分:3)

a = [ [0,'abc'], [1,'def'] ]

k,v = a.transpose
  #=> [[0, 1], ["abc", "def"]] 
k #=> [0, 1] 
v #=> ["abc", "def"] 

我无法自己写keysvalues,因为这些词通常是为哈希保留的。