2014-10-16 127 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