我想數組如何更改數組數組中元素的順序?
變換[[:name1, :value1], [:name2, :value2]]
數組
[[:value1, :name1], [:value2, :name2]]
什麼是做到這一點的最好方法是什麼?
我想數組如何更改數組數組中元素的順序?
變換[[:name1, :value1], [:name2, :value2]]
數組
[[:value1, :name1], [:value2, :name2]]
什麼是做到這一點的最好方法是什麼?
各種選項(每個版本,接着短手糖):
# 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
的引用,並且希望其中一個未打開。
第三種選擇是最「破壞性」的;對成對元素的每一個引用都會被改變。但是,它也是最具有內存效率的,因爲沒有創建新的數組。
只是換有趣的答案(旋轉像魔方矩陣):
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]]
還有一方法是使用to_h
to_a
:
array = [[:name1, :value2], [:name2, :value2]]
array.to_h # {name1: :value1, name2: :value2}
.invert # {value1: :name1, value2: :name2}
.to_a # [[:value1, :name1], [:value2, :name2]]
此解決方案期望所有名稱和值都是唯一的。 –
你只需要交換每一對?你有什麼嘗試?有很多方法可以解決這個問題,「最好」是主觀的。 – Carcigenicate