根据值从数组中选择索引

时间:2017-08-30 17:59:52

标签: arrays ruby select multidimensional-array indexing

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

我该怎么做?

2 个答案:

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

您可以根据需要更改代码。