2017-04-18 106 views
0

我想数组如何更改数组数组中元素的顺序?

变换
[[:name1, :value1], [:name2, :value2]] 

数组

[[:value1, :name1], [:value2, :name2]] 

什么是做到这一点的最好方法是什么?

+0

你只需要交换每一对?你有什么尝试?有很多方法可以解决这个问题,“最好”是主观的。 – Carcigenicate

回答

5

各种选项(每个版本,接着短手糖):

# Create a new array of swapped elements 
my_array = my_array.map{ |a| a.reverse } 
my_array = my_array.map(&:reverse) 

# Mutate the existing array with swapped elements 
my_array.map!{ |a| a.reverse } 
my_array.map!(&:reverse) 

# Mutate the elements in the existing array 
my_array.each{ |a| a.reverse! } 
my_array.each(&:reverse!) 

第一个选项是“最安全的”,只要没有现有阵列被修改(如果你有给那些其它参考不应该改变)。

第二个选项与第一个选项大致相同,除非您有两个对my_array的引用,并且希望其中一个未打开。

第三种选择是最“破坏性”的;对成对元素的每一个引用都会被改变。但是,它也是最具有内存效率的,因为没有创建新的数组。

2

只是换有趣的答案(旋转像魔方矩阵):

array = [[:name1, :value1], [:name2, :value2]] 
array.transpose # [[:name1, :name2], [:value1, :value2]] 
    .reverse # [[:value1, :value2], [:name1, :name2]] 
    .transpose 
#=> [[:value1, :name1], [:value2, :name2]] 

还有一个(而不是有趣,很明显,但还是有可能)的方式:

array.inject(&:zip).reverse.inject(&:zip) 
#=> [[:value1, :name1], [:value2, :name2]] 
0

还有一方法是使用to_hto_a

array = [[:name1, :value2], [:name2, :value2]] 
array.to_h # {name1: :value1, name2: :value2} 
    .invert # {value1: :name1, value2: :name2} 
    .to_a # [[:value1, :name1], [:value2, :name2]] 
+0

此解决方案期望所有名称和值都是唯一的。 –