我有一个大型数组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
非常感谢。
答案 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