在不更改索引的情况下操作数组元素

时间:2015-02-06 20:19:54

标签: ruby arrays indexing

我正在尝试对数组中的某些元素进行操作,同时在块中引用它们的索引。在整个阵列上操作很容易

arr = [1, 2, 3, 4, 5, 6, 7, 8]
arr.each_with_index { |num, index| puts "#{num}, "#{index}" }

但是如果我只想使用元素46来返回

4, 3

6, 5

我可以创建一个由原始元素组成的新数组,并在其上运行块,但随后索引会发生变化。

如何选择元素及其索引?

2 个答案:

答案 0 :(得分:0)

只是说明一个条件:

indice = [3, 5]
arr.each_with_index do
  |num, index| puts "#{num}, #{index}" if indice.include?(index)
end

这是另一种风格:

indice = [3, 5]
arr.each_with_index do
  |num, index|
  next unless indice.include?(index)
  puts "#{num}, #{index}"
end

答案 1 :(得分:0)

我无法从问题中判断出你是否在数组中给出了值并希望获得它们的索引,反之亦然。因此,我将为每项任务提出一种方法。我将使用此数组作为示例:

arr = [1, 2, 3, 4, 5, 6, 7, 8]

指数值

如果给你值:

vals = [4, 6]

您可以像这样检索数字索引对:

vals.map { |num| [num, arr.index(num)] }
  #=> [[4, 3], [6, 5]]

或直接打印:

vals.each { |num| puts "#{num}, #{arr.index(num)}" }
# 4, 3
# 6, 5
#=> [4, 6] 

如果vals中没有arr的元素:

vals = [4, 99]
vals.map { |num| [num, arr.index(num)] }
  #=> [[4, 3], [99, nil]] 

价值指数

如果给你索引:

indices = [3, 5]

您可以像这样检索索引值对:

indices.zip(arr.values_at(*indices))
  #=> [[3, 4], [5, 6]] 

然后以您喜欢的任何格式打印。

如果索引超出范围,将返回nil

indices.zip(arr.values_at(*[3, 99]))
  #=> [[3, 4], [5, nil]]