我想数组如何更改数组数组中元素的顺序?
变换[[: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