# Array of hashes (finding value)

**URL:** <https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073>\
**Category:** Ruby\
**Created:** [July 14, 2008, 11:26pm UTC](https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073 "2008-07-14T23:26:58Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![nateleavitt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/3bc359/32.png) [@nateleavitt](https://www.ruby-forum.com/u/nateleavitt)\
**Post date:** [July 14, 2008, 11:26pm UTC](https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073/1 "2008-07-14T23:26:58Z")

</div>

I’m just looking for other possible solutions. Sorry, this is kinda a  
noob question.

Currently I loop through the array and check the value of each hash key  
to find values. Is that the only and/or best way to find matches?

example:

@invoices = [{:id =\> 1, :first\_name =\> ‘nate’}, {:id =\> 2, :fist\_name =\>  
‘greg’}, {:id =\> 3, :first\_name =\>}]

@invoices.each do |invoice|  
if invoice[:id] == params[:contact\_id]  
bla… bla…  
end  
end

---

<div class="post-metadata">

**Author:** ![nateleavitt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/3bc359/32.png) [@nateleavitt](https://www.ruby-forum.com/u/nateleavitt)\
**Post date:** [July 14, 2008, 11:38pm UTC](https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073/2 "2008-07-14T23:38:33Z")

</div>

On Mon, Jul 14, 2008 at 3:22 PM, Nate L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> ## @invoices.each do |invoice| if invoice[:id] == params[:contact\_id] bla… bla… end end
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

With the construct you have there it would be faster to just store the  
names  
in an array at the index corresponding to :id. Although if this is  
coming  
out of Rails that probably isn’t a viable option. If you are stuck with  
that construct then what you have should work fine. There are probably  
faster/more efficient ways though.

–  
“Hey brother Christian with your high and mighty errand, Your actions  
speak  
so loud, I can’t hear a word you’re saying.”

-Greg Graffin (Bad Religion)

---

<div class="post-metadata">

**Author:** ![nateleavitt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/3bc359/32.png) [@nateleavitt](https://www.ruby-forum.com/u/nateleavitt)\
**Post date:** [July 14, 2008, 11:42pm UTC](https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073/3 "2008-07-14T23:42:09Z")

</div>

Glen H. wrote:

> On Mon, Jul 14, 2008 at 3:22 PM, Nate L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> wrote:
> 
> > ## @invoices.each do |invoice| if invoice[:id] == params[:contact\_id] bla… bla… end end
> > 
> > Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).
> 
> With the construct you have there it would be faster to just store the  
> names  
> in an array at the index corresponding to :id. Although if this is  
> coming  
> out of Rails that probably isn’t a viable option. If you are stuck with  
> that construct then what you have should work fine. There are probably  
> faster/more efficient ways though.
> 
> –  
> “Hey brother Christian with your high and mighty errand, Your actions  
> speak  
> so loud, I can’t hear a word you’re saying.”
> 
> -Greg Graffin (Bad Religion)

Thanks for the reply. Yes, I am working in rails 🙂 It just seems  
kinda tedious to keep iterating over all these collections. Just  
wondering if there is a more efficient way.

---

<div class="post-metadata">

**Author:** ![nateleavitt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/3bc359/32.png) [@nateleavitt](https://www.ruby-forum.com/u/nateleavitt)\
**Post date:** [July 15, 2008, 12:28am UTC](https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073/4 "2008-07-15T00:28:19Z")

</div>

On Mon, Jul 14, 2008 at 2:37 PM, Nate L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > > @invoices.each do |invoice|  
> > > if invoice[:id] == params[:contact\_id]  
> > > bla… bla…  
> > > end
> 
> Thanks for the reply. Yes, I am working in rails 🙂 It just seems  
> kinda tedious to keep iterating over all these collections. Just  
> wondering if there is a more efficient way.

Where did @invoices come from in the first place? If it came from the  
database, you are probably doing things in your loop that you should  
be doing in the sql query (e.g. Invoice.find(params[:contact\_id])  
rather than your if guard in the loop)

martin

---

<div class="post-metadata">

**Author:** ![nateleavitt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/3bc359/32.png) [@nateleavitt](https://www.ruby-forum.com/u/nateleavitt)\
**Post date:** [July 15, 2008, 12:48am UTC](https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073/5 "2008-07-15T00:48:00Z")

</div>

Martin DeMello wrote:

> On Mon, Jul 14, 2008 at 2:37 PM, Nate L. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> wrote:
> 
> > > > @invoices.each do |invoice|  
> > > > if invoice[:id] == params[:contact\_id]  
> > > > bla… bla…  
> > > > end
> > 
> > Thanks for the reply. Yes, I am working in rails 🙂 It just seems  
> > kinda tedious to keep iterating over all these collections. Just  
> > wondering if there is a more efficient way.
> 
> Where did @invoices come from in the first place? If it came from the  
> database, you are probably doing things in your loop that you should  
> be doing in the sql query (e.g. Invoice.find(params[:contact\_id])  
> rather than your if guard in the loop)
> 
> martin

Yeah… sorry. I actually get the collection through an xml-rpc call 🙂  
which returns the array of hashes.

---

<div class="post-metadata">

**Author:** ![nateleavitt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/3bc359/32.png) [@nateleavitt](https://www.ruby-forum.com/u/nateleavitt)\
**Post date:** [July 15, 2008, 12:14am UTC](https://www.ruby-forum.com/t/array-of-hashes-finding-value/143073/6 "2008-07-15T00:14:50Z")

</div>

Nate L. wrote:

> Glen H. wrote:

> > in an array at the index corresponding to :id. Although if this is  
> > coming  
> > out of Rails that probably isn’t a viable option. If you are stuck with  
> > that construct then what you have should work fine. There are probably  
> > faster/more efficient ways though.

> Thanks for the reply. Yes, I am working in rails 🙂 It just seems  
> kinda tedious to keep iterating over all these collections. Just  
> wondering if there is a more efficient way.

invoice\_set=@invoices.select{|invoice|invoice[:id]==params[:contact\_id]}

invoice\_set.each do |invoice|  
#stuff with invoice  
end

Doubt if it is less work but it feels snappier somehow.

Regards,

Siep
