2014-10-16 89 views
6

我有一个具有唯一元素的数组。有没有办法用另一个值替换它中的某个值而不使用它的索引值?替换数组中的单个元素

例子:

array = [1,2,3,4] 
if array.include? 4 
# "replace 4 with 'Z'" 
end 
array #=> [1,2,3,'Z'] 

hash = {"One" => [1,2,3,4]} 
if hash["One"].include? 4 
# "replace 4 with 'Z'" 
end 
hash #=> {"One" => [1,2,3,'Z']} 
+0

你是什么在这里寻找:'array = [1,4,4]; if array.include? 4#用'Z'替换4? – 2014-10-16 23:42:20

+0

@CarySwoveland是的,我只需要用我选择的另一个元素替换4(s)。 [1,4,4] => [1,'Z','Z'] – Lasonic 2014-10-16 23:46:33

+0

我认为只有第一个这样的实例应该被替换,因为标题中显示“单个元素”。但事实证明并非如此。 – sawa 2014-10-16 23:46:36

回答

12
p array.map { |x| x == 4 ? 'Z' : x } 

# => [1, 2, 3, 'Z'] 
+1

如果第一个元素等于4,为什么要穿过整个阵列? – 2014-11-07 22:32:15

4

您可以使用Array#map

array = array.map do |e| 
    if e == 4 
    'Z' 
    else 
    e 
    end 
end 

编辑阵列中的位置,而不是创建一个新的数组,使用Array#map!

如果你有一个以上的你想要替换的东西,你可以使用哈希来映射从旧到新:

replacements = { 
    4 => 'Z', 
    5 => 'five', 
} 
array = array.map do |e| 
    replacements.fetch(e, e) 
end 

这使得使用Hash#fetch功能,其中如果找不到键,第二个参数将被用作默认值。

+0

如果我的数组在像更新一样的哈希中? – Lasonic 2014-10-16 23:29:56

+1

@Lasonic然后:'hash ['key']。map!做| e | ... end' – 2014-10-17 01:58:55

2

一个非常简单的解决方案,假设不会有重复和顺序并不重要:

hash = { 'One' => [1, 2, 3, 4] } 

hash['One'].instance_eval { push 'Z' if delete 4 } 
+1

如果它不是数组中的最后一个元素呢? – Lasonic 2014-10-16 23:28:50

+0

反对票的原因是什么? – 2014-10-16 23:41:57

+1

我不会这样做,但它很有趣。也许我们中间有一个流氓下流者。 – 2014-10-17 00:02:37

5

你可以做到这一点是:

array[array.index(4)] = "Z" 

如果元素不一定在阵列中,然后

if i = array.index(4) 
    array[i] = "Z" 
end 
+0

他说他不想使用该项目的索引值。 – 2014-10-16 23:32:59

+2

虽然我同意你的看法,但我认为你的评论有点苛刻。 – 2014-10-17 02:00:17

+0

@MarkThomas也许吧。但我怀疑这个帖子是伴随着一个倒退,这使情况变得更糟。 – sawa 2014-10-17 02:08:44