2017-04-18 101 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

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