如何在嵌套数组内交换变量?

时间:2019-04-02 15:17:42

标签: ruby-on-rails arrays

我有两个压缩在一起的数组,现在我想在偶数位置滑动值。

这就是我尝试过的:

a = [1, 2, 3, 4]
b = [111, 222, 333, 444]
c = a.zip(b)

# Now c is equal to: [[1, 111], [2, 222],[3, 333],[4, 444]]

 c.map.with_index do |item, index|
   a = item[0]
   b = item[1]
   if index%2 == 0
     a, b = b, a
   end
 end

我想拥有的东西

c = [[1, 111], [222,2], [3, 333],[444, 4]]

但是它仍然不起作用,是否有更好的解决方案?或者我该如何解决我的问题呢?

编辑: 我已经意识到,我可以只使用“ .reverse”方法来交换元素。但是我仍然无法使其正常工作。

2 个答案:

答案 0 :(得分:3)

也许尝试:

c.map.with_index do |item, index|
  index%2 != 0 ? item.reverse : item
end

 => [[1, 111], [222, 2], [3, 333], [444, 4]] 

答案 1 :(得分:1)

我可能会选择

a = [1, 2, 3, 4]
b = [111, 222, 333, 444]

a.zip(b).each_with_index do |item, idx|
  item.reverse! if idx.odd?
end
#=>[[1, 111], [222, 2], [3, 333], [444, 4]] 

zip,而reverse!只是index是奇数的项目。

其他选项包括:

a.map.with_index(1) do |item,idx| 
  [item].insert(idx % 2, b[idx -1])
end
#=>[[1, 111], [222, 2], [3, 333], [444, 4]] 

在这里,我们使用with_index从1开始,然后使用取模方法确定b中的项目是否应放置在索引0或索引1上。

a.zip(b).tap {|c| c.each_slice(2) {|_,b| b.reverse!}}
#=>[[1, 111], [222, 2], [3, 333], [444, 4]]

在这里我们像您的示例那样压缩a和b,然后我们将Array子分成2组,并使用Array反转第二个reverse!,这将修改{{1 }} 到位。