【问题标题】:In Ruby, how do I replace an element in an array with potentially multiple elements?在 Ruby 中,如何用可能的多个元素替换数组中的元素?
【发布时间】:2017-07-22 11:31:10
【问题描述】:

使用 Ruby 2.4。我有一个字符串数组。如何用可能的多个元素替换数组中的一个元素?我有

phrases[index] = tokens 

然而,tokens 是一个数组,现在这会产生一个带有字符串和数组的短语数组......

["abc", ["a", "b"], "123"]

如果标记是 ["a", "b"] 并且索引是 1,我希望结果是

["abc", "a", "b", "123"]

我该怎么做?

【问题讨论】:

    标签: arrays ruby replace


    【解决方案1】:

    您可以使用Array#[]= 指定startlength;从start 索引中替换length 元素的子数组

    或指定range;替换由索引范围指定的子数组。

    phrases = ["abc", "token_placeholder", "123"]
    tokens = ["a", "b"]
    index = 1
    phrases[index, 1] = tokens
    #       ^^^^^^^^^ ------------------ start and length
    
    # OR phrases[index..index] = tokens
    #            ^^^^^^^^^^^^ -------------- range
    
    phrases # => ["abc", "a", "b", "123"]
    

    【讨论】:

    • 很好,我从来没有遇到过这种语法。很高兴知道!
    • ary[start, length] = obj or other_ary or nil[]= 文档中。
    【解决方案2】:

    你可以使用Enumerable#flat_map:

    arr = ["abc", ["a", "b"], "123"]
    
    arr.flat_map(&:itself)
      #=> ["abc", "a", "b", "123"] 
    

    arr 保持不变。原地修改arr

    arr.replace(arr.flat_map(&:itself))
      #=> ["abc", "a", "b", "123"] 
    arr
      #=> ["abc", "a", "b", "123"] 
    

    【讨论】:

      【解决方案3】:

      平面映射将是一种更好的方法,它映射(转换)然后将列表展平为单个数组。假设我们想为偶数添加两个元素:

      (1..10).flat_map { |i| i.even? ? [i, i**2] : i }
      

      它会返回:

      [1, 2, 4, 3, 4, 16, 5, 6, 36, 7, 8, 64, 9, 10, 100]
      

      与返回的地图相比:

      [1, [2, 4], 3, [4, 16], 5, [6, 36], 7, [8, 64], 9, [10, 100]]
      

      【讨论】:

        猜你喜欢
        • 2014-12-17
        • 2019-10-14
        • 2015-11-09
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 1970-01-01
        相关资源
        最近更新 更多