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

时间:2017-04-18 14:24:46

标签: arrays ruby

我想转换数组

.navbar-right, .dropdown, .dropdown-menu {
  width: 130px;
}

到数组

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

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分: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的引用,并希望其中一个未被修改。

第三种选择是最具破坏性的&#39 ;;对成对元素的每个引用都将被更改。但是,它也是最节省内存的,因为没有创建新的数组。

答案 1 :(得分:2)

非常有趣的回答(像rubik的立方体一样旋转矩阵):

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]]

答案 2 :(得分:0)

另一种方法是使用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]]