2016-05-24 42 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]}  
相关问题