获取数组中三个连续元素的值

时间:2011-10-30 02:45:40

标签: ruby arrays cgi url-parameters

我有一个大型数组h,它包含一个名为startingParam的参数的几个实例,后面跟着另外两个相关但不总是相同的参数。我需要在数组中查找startingParam的每个实例,并将它和接下来的两个参数推送到一个单独的数组holdingArray中。

以下代码无效,因为我是Ruby的新手。有谁知道我做错了什么?有没有更好的方法来解决这个问题?

h.each do |param|
    if param == 'startingParam'
        holdingArray << h.[param],
        holdingArray << h.[param + 1],
        holdingArray << h.[param + 2]
    end
end

非常感谢。

4 个答案:

答案 0 :(得分:5)

您可以使用#slice_before

抓取这些块
arr = ['startingParam', 1, 2, 'startingParam', 3, 4]

arr.slice_before('startingParam')
# => [['startingParam', 1, 2], ['startingParam', 3, 4]]

如果您创建了原始数据结构,则可能需要重新考虑您的设计。

答案 1 :(得分:3)

功能方法:

>> ary = ['hello', 'startingParam', 1, 2, 'xyz', 'startingParam', 3, 4, 'bye']    
>> ary.each_cons(3).select { |v, *vs| v == "startingParam" }.flatten(1)
=> ["startingParam", 1, 2, "startingParam", 3, 4]

答案 2 :(得分:2)

所以有一些问题。对于初学者,您不能通过执行h.[anything]下标数组,并且您也基于值(而不是索引)进行下标。您还要检查参数是否与文字字符串“starting_param”匹配,而不是其值。所以我期望你想要的是以下内容:

h.each_with_index do |param, index|
  if param == startingParam
    holdingArray << h[index]
    holdingArray << h[index+1]
    holdingArray << h[index+2]
  end
end

你还会注意到,如果项目位于数组的最后两个插槽中,这将包围并从数组的开头抓取项目(由于Ruby处理数组下标超出范围的方式)。 / p>

答案 3 :(得分:1)

你也可以使用范围切片操作(我稍微改变了varnames,因为camelcasing在ruby中是坏的样式)

h.each_with_index do |param, index|
  if param == starting_param
     holding_array.push(h[index..index+2])
  end
end