Map an array modifying only elements matching a certain condition

前端 未结 9 2212
梦如初夏
梦如初夏 2021-02-05 09:07

In Ruby, what is the most expressive way to map an array in such a way that certain elements are modified and the others left untouched?

This is a straight-forw

相关标签:
9条回答
  • 2021-02-05 09:28

    It's a few lines long, but here's an alternative for the hell of it:

    oa = %w| a b c |
    na = oa.partition { |a| a == 'b' }
    na.first.collect! { |a| a+'!' }
    na.flatten! #Add .sort! here if you wish
    p na
    # >> ["b!", "a", "c"]
    

    The collect with ternary seems best in my opinion.

    0 讨论(0)
  • 2021-02-05 09:29
    old_a.map! { |a| a == "b" ? a + "!" : a }
    

    gives

    => ["a", "b!", "c"]
    

    map! modifies the receiver in place, so old_a is now that returned array.

    0 讨论(0)
  • 2021-02-05 09:33

    Because arrays are pointers, this also works:

    a = ["hello", "to", "you", "dude"]
    a.select {|i| i.length <= 3 }.each {|i| i << "!" }
    
    puts a.inspect
    # => ["hello", "to!", "you!", "dude"]
    

    In the loop, make sure you use a method that alters the object rather than creating a new object. E.g. upcase! compared to upcase.

    The exact procedure depends on what exactly you are trying to achieve. It's hard to nail a definite answer with foo-bar examples.

    0 讨论(0)
提交回复
热议问题