我有Ruby代码,如下所示:
a = widgets["results"]["cols"].each_with_index.select do |v, i|
v["type"] == "string"
end
我只想获取v["type"]
为“string”的任何值的索引。 “结果”的外部数组有大约10个值(“cols”的内部数组有两个 - 其中一个的索引为“type”);我期待在这样的数组中返回两个结果:[7, 8]
。但是,我得到的结果如下:
[[{"element"=>"processed", "type"=>"string"}, 7], [{"element"=>"settled", "type"=>"string"}, 8]]
我该怎么做?
答案 0 :(得分:4)
如果您看到cols.each_with_index.to_a
:
[[{:element=>"processed", :type=>"string"}, 0], [{:element=>"processed", :type=>"number"}, 1], ...]
会将数组中的每个哈希值作为第一个值,并将第二个值作为索引。如果选择将返回一个包含给定块返回true的所有enum元素的数组,则很难获得索引。
但是您也可以尝试each_index
,传递元素的索引而不是元素本身,因此它只会为您提供索引,例如[0,1,2,4]
通过这种方式,您可以应用验证,通过索引访问cols
哈希中的每个元素,并检查type
键的值,例如:
widgets = {
results: {
cols: [
{ element: 'processed', type: 'string' },
{ element: 'processed', type: 'number' },
{ element: 'processed', type: 'string' }
]
}
}
cols = widgets[:results][:cols]
result = cols.each_index.select { |index| cols[index][:type] == 'string' }
p result
# [0, 2]
答案 1 :(得分:1)
您可以使用数组注入方法以最小的#no行获得预期的输出,代码如下所示
cols = [{'type' => 'string'}, {'type' => 'not_string'}, {'type' => 'string'}]
cols.each_with_index.inject([]) do |idxs, (v, i)|
idxs << i if v['type'] == 'string'
idxs
end
输出如下,
=> [0, 2]
您可以根据需要更改代码。