[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Deleting values of array elements

Jonas Schneider

2/11/2008 4:52:00 PM

Heya,

I'm pretty sure theres an easy way for this:
I have a collection of objects; I want to remove 1 property (they all
have it in common) from them.

so if

a = [
{:a => 'blah', :prop => '123'},
{:a => 'blab', :prop => '234'}
]

I want to remove the attribute "prop" from all of them.
I tried it with this the first time:

a.collect {|x| y = x.to_a; y.delete(x.prop); y }

but it doesnt seem to work; i the property isn't removed, and it would
also be bad if some other property would have the same value cause it
would get removed, too.

I´m sure there's some a.without method or something, but I'm not able
to find it...

Help?

Greets
Jonas
5 Answers

Robert Klemme

2/11/2008 5:08:00 PM

0

On 11.02.2008 17:52, Jonas Schneider wrote:
> Heya,
>
> I'm pretty sure theres an easy way for this:
> I have a collection of objects; I want to remove 1 property (they all
> have it in common) from them.
>
> so if
>
> a = [
> {:a => 'blah', :prop => '123'},
> {:a => 'blab', :prop => '234'}
> ]
>
> I want to remove the attribute "prop" from all of them.

That is not an attribute but a hash key.

> I tried it with this the first time:
>
> a.collect {|x| y = x.to_a; y.delete(x.prop); y }
>
> but it doesnt seem to work; i the property isn't removed, and it would
> also be bad if some other property would have the same value cause it
> would get removed, too.
>
> I´m sure there's some a.without method or something, but I'm not able
> to find it...

Do you mean

irb(main):001:0> a = [
irb(main):002:1* {:a => 'blah', :prop => '123'},
irb(main):003:1* {:a => 'blab', :prop => '234'}
irb(main):004:1> ]
=> [{:a=>"blah", :prop=>"123"}, {:a=>"blab", :prop=>"234"}]
irb(main):005:0> a.each {|x| x.delete :prop}
=> [{:a=>"blah"}, {:a=>"blab"}]

?

If you want the original unmodified you can do

a.map {|x| x.dup.delete :prop}

Cheers

robert

Jonas Schneider

2/11/2008 8:55:00 PM

0

On 11 Feb., 18:07, Robert Klemme <shortcut...@googlemail.com> wrote:
> a.map {|x| x.dup.delete :prop}

yay, works great =)

only problem: The array actually consists of objects, I forgot.
So they dont have the delete method.
I've now done this with _x.dup.prop = nil; x_ but it seems a little
ugly to have that nil still in there.
I know, in PHP there is the unset function; is there somethin
aequivalent in ruby to get rid of it completely?

Greets
Jonas

Rick DeNatale

2/11/2008 9:20:00 PM

0

On 2/11/08, Jonas Schneider <JS.Sokrates@googlemail.com> wrote:
> On 11 Feb., 18:07, Robert Klemme <shortcut...@googlemail.com> wrote:
> > a.map {|x| x.dup.delete :prop}
>
> yay, works great =)
>
> only problem: The array actually consists of objects, I forgot.
> So they dont have the delete method.
> I've now done this with _x.dup.prop = nil; x_ but it seems a little
> ugly to have that nil still in there.
> I know, in PHP there is the unset function; is there somethin
> aequivalent in ruby to get rid of it completely?

Not as far as I know in Ruby < 1.9

Ruby 1.9 has a private Object#remove_instance_variable method, but
unless you are using the defined? operator you really can't tell
whether an instance variable exists since just referring to it creates
it if it doesn't already exist.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...

Robert Klemme

2/11/2008 9:23:00 PM

0

On 11.02.2008 21:54, Jonas Schneider wrote:
> On 11 Feb., 18:07, Robert Klemme <shortcut...@googlemail.com> wrote:
> only problem: The array actually consists of objects, I forgot.

So the code you showed is not the original code?

> So they dont have the delete method.
> I've now done this with _x.dup.prop = nil; x_ but it seems a little
> ugly to have that nil still in there.
> I know, in PHP there is the unset function; is there somethin
> aequivalent in ruby to get rid of it completely?

Why don't you

a.map {|x| x = x.dup; x.prop = nil; x}

? Do you actually need the copy?

robert

Jonas Schneider

2/12/2008 3:04:00 PM

0

On 11 Feb., 22:23, Robert Klemme <shortcut...@googlemail.com> wrote:
> So the code you showed is not the original code?

Nah, I simplified it =)

I now have it done with x.clone(), so all works great now.

I didn't use defined?, but to_json, and I didnt want it to appear
there.

Thanks =)
-- Jonas