如何替换数组的元素?

gwe*_*weg 26 ruby arrays

我怎样才能替换数组中的元素?

a = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

我需要替换5 [11,22,33,44].flatten!

使a现在成为

a = [1,2,3,4,11,22,33,44]
Run Code Online (Sandbox Code Playgroud)

Rya*_*ary 43

不确定您是否要替换特定值,但这有效:

a = [1, 2, 3, 4, 5]
b = [11, 22, 33, 44]
a.map! { |x| x == 5 ? b : x }.flatten!
Run Code Online (Sandbox Code Playgroud)

迭代值a,当它找到值时5,它用数组替换该值b,然后将数组展平为一个数组.

  • 虽然这确实有效,但它对于原始海报试图做的事情来说过于复杂.使用阵列切片来替换范围是一种更直接和简单的解决方案.请参阅[此答案](http://stackoverflow.com/a/1704805/456814). (2认同)

Dig*_*oss 18

也许你的意思是:

a[4] = [11,22,33,44] # or a[-1] = ...
a.flatten!
Run Code Online (Sandbox Code Playgroud)

功能性解决方案可能更好,仅仅是:

a[0..-2] + [11, 22, 33, 44]
Run Code Online (Sandbox Code Playgroud)

产量......

=> [1, 2, 3, 4, 11, 22, 33, 44]
Run Code Online (Sandbox Code Playgroud)


Gui*_*ume 14

使用a.index(5)的bta版本是最快的:

a[a.index(5)] = b if a.index(5) # 5.133327 sec/10^6
Run Code Online (Sandbox Code Playgroud)

Ryan McGeary的速度快至少10%:

a.map!{ |x| x == 5 ? b : x } # 5.647182 sec/10^6
Run Code Online (Sandbox Code Playgroud)

但请注意,a.index(5)仅返回找到5的第一个索引.因此,给定一个阵列,其中5出现不止一次,结果将是不同的:

a = [1, 2, 3, 4, 5, 5]
b = [11,22,33,44]

a[a.index(5)] = b if a.index(5)
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 5]

a.map!{ |x| x == 5 ? b : x }
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 11, 22, 33, 44]
Run Code Online (Sandbox Code Playgroud)


小智 6

Array#delete将返回item或nil.您可以使用它来了解是否推送新值

a.push 11,22,33,44 if a.delete 5
Run Code Online (Sandbox Code Playgroud)


Ben*_*Cox 5

如果你只是连接,你真的不必压扁.因此,修剪第一个数组的最后一个元素并将它们连接起来:

a = [ 1, 2, 3, 4, 5 ]           #=> [1, 2, 3, 4, 5]
t = [11, 22, 33, 44]            #=> [11, 22, 33, 44]
result = a[0..-2] + t           #=> [1, 2, 3, 4, 11, 22, 33, 44]
Run Code Online (Sandbox Code Playgroud)

a [0 ..- 2]是一个切片操作,它接受除数组的最后一个元素之外的所有元素.

希望能帮助到你!


bta*_*bta 5

5无论阵列中的哪个位置,此变体都会找到它.

a = [1, 2, 3, 4, 5]
a[a.index(5)]=[11, 22, 33, 44] if a.index(5)
a.flatten!
Run Code Online (Sandbox Code Playgroud)