Deleting values of array elements

Discussion in 'Ruby' started by Jonas Schneider, Feb 11, 2008.

  1. 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
     
    Jonas Schneider, Feb 11, 2008
    #1
    1. Advertising

  2. 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
     
    Robert Klemme, Feb 11, 2008
    #2
    1. Advertising

  3. On 11 Feb., 18:07, Robert Klemme <> 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
     
    Jonas Schneider, Feb 11, 2008
    #3
  4. On 2/11/08, Jonas Schneider <> wrote:
    > On 11 Feb., 18:07, Robert Klemme <> 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.denhaven2.com/
     
    Rick DeNatale, Feb 11, 2008
    #4
  5. On 11.02.2008 21:54, Jonas Schneider wrote:
    > On 11 Feb., 18:07, Robert Klemme <> 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
     
    Robert Klemme, Feb 11, 2008
    #5
  6. On 11 Feb., 22:23, Robert Klemme <> 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
     
    Jonas Schneider, Feb 12, 2008
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Harry Barker
    Replies:
    2
    Views:
    544
    Alf P. Steinbach
    Apr 19, 2006
  2. dkmd_nielsen
    Replies:
    5
    Views:
    170
    dkmd_nielsen
    Mar 8, 2007
  3. Sean Nakasone
    Replies:
    1
    Views:
    200
  4. Newcomsas
    Replies:
    3
    Views:
    107
    Thomas 'PointedEars' Lahn
    Dec 1, 2005
  5. crea
    Replies:
    2
    Views:
    441
    Nobody
    Dec 28, 2012
Loading...

Share This Page