在 Ruby 中,如何用可能的多个元素替换数组中的元素?

Posted

技术标签:

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

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

phrases[index] = tokens 

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

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

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

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

我该怎么做?

【问题讨论】:

【参考方案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]]

【讨论】:

以上是关于在 Ruby 中,如何用可能的多个元素替换数组中的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何用JavaScript替换数组中间隔多个参数

如何用随机数组元素替换文本?

如何用另一个数组值替换javascript中的数组值?

如何用相同的值替换双精度数组中的所有项目[重复]

如何用零替换数组中的所有负数[重复]

如何用复选框jQuery替换数组中的值