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

Operate on array elements without changing index

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

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

但是,如果我只想使用元素 46 到 return

怎么办?
4, 3

6, 5

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

如何 select 元素及其索引?

只要加上条件就可以了:

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

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

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