Deleting values of array elements

J

Jonas Schneider

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
 
R

Robert Klemme

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
 
J

Jonas Schneider

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
 
R

Rick DeNatale

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.
 
R

Robert Klemme

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
 
J

Jonas Schneider

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top