Starting with the following array (of hashes):
[
{:name=>"site a", :url=>"http://example.org/site/1/"},
{:name=>"site b", :url=>"http://example.org/site/2/"},
{:name=>"site c", :url=>"http://example.org/site/3/"},
{:name=>"site d", :url=>"http://example.org/site/1/"},
{:name=>"site e", :url=>"http://example.org/site/2/"},
{:name=>"site f", :url=>"http://example.org/site/6/"},
{:name=>"site g", :url=>"http://example.org/site/1/"}
]
How can I add an index of the duplicate urls like so:
[
{:name=>"site a", :url=>"http://example.org/site/1/", :index => 1},
{:name=>"site b", :url=>"http://example.org/site/2/", :index => 1},
{:name=>"site c", :url=>"http://example.org/site/3/", :index => 1},
{:name=>"site d", :url=>"http://example.org/site/1/", :index => 2},
{:name=>"site e", :url=>"http://example.org/site/2/", :index => 2},
{:name=>"site f", :url=>"http://example.org/site/6/", :index => 1},
{:name=>"site g", :url=>"http://example.org/site/1/", :index => 3}
]
I would use a hash for keeping track of the indices. Scanning the previous entries again and again seems inefficient
counts = Hash.new(0)
array.each { | hash |
hash[:index] = counts[hash[:url]] = counts[hash[:url]] + 1
}
or a bit cleaner
array.each_with_object(Hash.new(0)) { | hash, counts |
hash[:index] = counts[hash[:url]] = counts[hash[:url]] + 1
}
array = [
{:name=>"site a", :url=>"http://example.org/site/1/"},
{:name=>"site b", :url=>"http://example.org/site/2/"},
{:name=>"site c", :url=>"http://example.org/site/3/"},
{:name=>"site d", :url=>"http://example.org/site/1/"},
{:name=>"site e", :url=>"http://example.org/site/2/"},
{:name=>"site f", :url=>"http://example.org/site/6/"},
{:name=>"site g", :url=>"http://example.org/site/1/"}
]
array.inject([]) { |ar, it|
count_so_far = ar.count{|i| i[:url] == it[:url]}
it[:index] = count_so_far+1
ar << it
}
#=>
[
{:name=>"site a", :url=>"http://example.org/site/1/", :index=>1},
{:name=>"site b", :url=>"http://example.org/site/2/", :index=>1},
{:name=>"site c", :url=>"http://example.org/site/3/", :index=>1},
{:name=>"site d", :url=>"http://example.org/site/1/", :index=>2},
{:name=>"site e", :url=>"http://example.org/site/2/", :index=>2},
{:name=>"site f", :url=>"http://example.org/site/6/", :index=>1},
{:name=>"site g", :url=>"http://example.org/site/1/", :index=>3}
]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With