是否有类似Array#index的方法,如果多次找到参数,则返回多个索引?

时间:2015-02-23 16:11:43

标签: ruby

idols = ['Mahatma Gandhi', 'Martin Luther King Jr', 'George Costanza', 'Nancy Wake', 'George Costanza', 'John Howard Griffin', 'George Costanza']

我想发出idols.indexes('George Costanza')并获得结果[2, 4, 6] - 我的偶像是George Costanza的每个位置。

有没有高效或内置的方法来做到这一点?

4 个答案:

答案 0 :(得分:1)

我想,我不知道这样做的任何内置方式,但你可以只用map.with_index来做。

def mul_indexes(arr,val)
    arr.map.with_index { |v, i| i if v == val }.compact
end

现在,您可以使用mul_indexes(idols, 'George Costanza')。另外,如果您打算经常使用它,最好将其设为Array#mul_indexes

答案 1 :(得分:1)

使用单例方法的另一种解决方案:

def idols.mul_indexes
  each_with_index.inject([]) {|m,(e,i)| count(e) > 1 ? m + [i] : m}
end

idols.mul_indexes    # [2, 4, 6]

答案 2 :(得分:0)

另一种方式:

def indexes(arr, match)
  arr.each_index.select { |i| arr[i] == match }
end

indexes(idols,'George Costanza')
  #=> [2,4,6]

我强烈建议不要使用猴子修补Array这个简单的方法。

答案 3 :(得分:0)

您始终可以扩展Array类以实现该功能

class Array
    def find_indexes(value)
        indexes = []
        self.each_with_index do |item,index|
            indexes << index if item == value
        end
        return indexes
    end
end

然后就这样做:idols.find_indexes('George Costanza')