2016-05-24 43 views
0

我無法找到將某些值轉換爲另一個鍵的最佳方法。每個值都會轉到下一個鍵,並且最後一個鍵的值需要被完全刪除。例如如何將散列值更改爲另一個鍵

hash1 = { a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9] } 

desired_hash = hash1.some_method 

desired_hash === { a: [], b: [1, 2, 3], c: [4, 5, 6] } 

我的想法是重新命名的哈希鍵,但不知道這是否是最好的辦法。

+0

你有確定的「下一個鍵」一種可靠的方法?他們真的去':a,:b,:c'?這將允許你使用'Symbol#succ'。 –

+2

您想說說更高層次的要求嗎?可能有更好的方法來完成它,這不是這個確切的方法。還是它必須是這個確切的方法? –

+0

哈希將按順序排列,但以數字而非字母。問題是一樣的,但改變鍵名不是必須的。基本上我只需要從一個鍵到下一個鍵就能獲得所有的價值。我知道我可以創建一個臨時變量並保存每個鍵的值,然後轉到下一個鍵並覆蓋它們,但這看起來更像是一種數組類型的任務。 –

回答

5
hash1 = { a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9] } 
keys = hash1.keys 
=> [:a, :b, :c] 
values = hash1.values 
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

keys.zip(values.unshift([])).to_h 
=> {:a=>[], :b=>[1, 2, 3], :c=>[4, 5, 6]} 
+0

太棒了!謝謝你,先生。 –

+0

@StephenGrayson,歡迎您 – Ilya

+0

請注意,您不需要中間變量,'hash1.keys.zip(hash1.values.unshift([]))。to_h'也可以。 – Stefan

0

假設散列鍵已經「按照正確的順序」。 你可以試試這個:

def shift(input) 
    output = {} 
    keys = input.keys 
    0.upto(keys.size - 1) do |index| 
    current = keys[index] 
    if index > 0 
     previous = keys[index - 1] 
     output[current] = input[previous] 
    else 
     output[current] = [] 
    end 
    end 
    output 
end 

input = { a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9] } 
p shift(input) 

它不是很優雅,有可能是一個好得多的解決方案,但它是一個起點。

1
pv = [] 
hash1.each_with_object({}) do |(k,v),h| 
    h[k] = pv 
    pv = v 
end 
    #=> {:a=>[], :b=>[1, 2, 3], :c=>[4, 5, 6]}  
相關問題