Ruby 如何找到具有特定值并影响其值的数组?红宝石色

Ruby 如何找到具有特定值并影响其值的数组?红宝石色,ruby,arrays,ruby-on-rails-4,Ruby,Arrays,Ruby On Rails 4,我有一个数组,如下所示: my_array = [ [value_1, value_2, value_3, value_4], [value_n1, value_n2, value_n3, value_n4], [value_x1, value_x2, value_x3, value_x4], [value_y1, value_y2, value_y3, value_y4], [value_z1, value_z2, value_

我有一个数组,如下所示:

 my_array =   [
      [value_1, value_2, value_3, value_4],
      [value_n1, value_n2, value_n3, value_n4],
      [value_x1, value_x2, value_x3, value_x4],
      [value_y1, value_y2, value_y3, value_y4],
      [value_z1, value_z2, value_z3, value_z4]
    ]
我发现数组有一些值,然后影响它们的值。例如:

some_value = 'xyz'
if my_array.map(&:first).include? some_value # I always compare 'some_value' with the first element of each array

  # find the array
  my_array.select{ |s| s.include? some_value }

  # affect the values with position [1], [2], [3]
  # ...

end
有没有一种简单的方法可以提取数组并影响其值​​?

例子 我有一个数组:

array = [ ['abc', 4, 5], ['xyz', 2, 10], ['ubf', 40, 9] ]
和一个值:
x='abc'

当我的变量“x”开始与我拥有的数组进行比较并找到包含此值的数组时。然后,应将1添加到其他值​​. 因此,我的预期结果是:

array = [ ['abc', **5**, **6**], ['xyz', 2, 10], ['ubf', 40, 9] ]
其他值:
x='ubf'


结果:
array=[[abc',5,6],'xyz',2,10],'ubf',**41**,**10**]

可能是这样的:

my_array.map{|a| a.include?(some_value) ? transform(a) : a }

def transform array
  #return your modified array
end
如果您输入
[[1,2],[2,3],[3,4]]
并且
某些值设置为3,您可以使用

def transform array do
    array.map{|k| k + 1}
  end

根据你问题的编辑,我想这就是你想要的

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

val = 4
(ndx = my_array.transpose.first.index(val)) ?
  ((1..my_array[ndx].size-1).each { |i|
    my_array[ndx][i] += 1 }; my_array) : nil
  #=> [[5, 3, 1], [1, 2, 3], [4, 6, 7], [7, 8, 9]]

val = 7
(ndx = my_array.transpose.first.index(val)) ?
  ((1..my_array[ndx].size-1).each { |i|
    my_array[ndx][i] += 1 }; my_array) : nil
  #=> [[5, 3, 1], [1, 2, 3], [4, 5, 6], [7, 9, 10]]

val = 6
(ndx = my_array.transpose.first.index(val)) ?
  ((1..my_array[ndx].size-1).each { |i|
    my_array[ndx][i] += 1 }; my_array) : nil
  #=> nil

通过子数组的第一个元素查找子数组是该方法的一项工作。 增加以下元素的价值是一项简单的任务。可能的实施:

array = [ ['abc', 4, 5], ['xyz', 2, 10], ['ubf', 40, 9] ]
x = 'abc'

marr = array.assoc(x)
marr[1..-1] = marr.drop(1).map {|v| v+1} if marr
p array
# [["abc", 5, 6], ["xyz", 2, 10], ["ubf", 40, 9]]

如果您有一个数组,但希望它以一种特殊的方式运行,那么您可能需要考虑创建一个类

class EGC < Array
  def increment(val)
    self.map do |sub|
      if sub.first == val
        [val, sub[1..-1].map(&:next)].flatten
      else
        sub
      end
    end
  end
end
当然,您应该更改名称以更好地反映您的问题域


也就是说,似乎最好从哈希开始,而不是从2D数组开始。

在您的示例中。如果我只想影响第二个位置,得到以下结果:[[1,2],[2,4],[3,5]]。如何更改函数转换?请检查我的示例您需要一个示例和相关的预期结果。@CarySwoveland完成。是否有多个数组与您要查找的
x
值匹配?例如,
array=[['abc',4,5],'xyz',2,10],'abc',40,9]
@JayMitchell No.在这种情况下,请检查我的示例。
e = EGC.new([["foo", 1, 2], ["bar", 3, 4]])
#=> [["foo", 1, 2], ["bar", 3, 4]]

e.increment("foo")
#=> [["foo", 2, 3], ["bar", 3, 4]]