我無法找到將某些值轉換爲另一個鍵的最佳方法。每個值都會轉到下一個鍵,並且最後一個鍵的值需要被完全刪除。例如如何將散列值更改爲另一個鍵
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] }
我的想法是重新命名的哈希鍵,但不知道這是否是最好的辦法。
我無法找到將某些值轉換爲另一個鍵的最佳方法。每個值都會轉到下一個鍵,並且最後一個鍵的值需要被完全刪除。例如如何將散列值更改爲另一個鍵
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] }
我的想法是重新命名的哈希鍵,但不知道這是否是最好的辦法。
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]}
假設散列鍵已經「按照正確的順序」。 你可以試試這個:
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)
它不是很優雅,有可能是一個好得多的解決方案,但它是一個起點。
pv = []
hash1.each_with_object({}) do |(k,v),h|
h[k] = pv
pv = v
end
#=> {:a=>[], :b=>[1, 2, 3], :c=>[4, 5, 6]}
你有確定的「下一個鍵」一種可靠的方法?他們真的去':a,:b,:c'?這將允許你使用'Symbol#succ'。 –
您想說說更高層次的要求嗎?可能有更好的方法來完成它,這不是這個確切的方法。還是它必須是這個確切的方法? –
哈希將按順序排列,但以數字而非字母。問題是一樣的,但改變鍵名不是必須的。基本上我只需要從一個鍵到下一個鍵就能獲得所有的價值。我知道我可以創建一個臨時變量並保存每個鍵的值,然後轉到下一個鍵並覆蓋它們,但這看起來更像是一種數組類型的任務。 –