我无法找到将某些值转换为另一个键的最佳方法。每个值都会转到下一个键,并且最后一个键的值需要被完全删除。例如如何将散列值更改为另一个键
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'。 –
您想说说更高层次的要求吗?可能有更好的方法来完成它,这不是这个确切的方法。还是它必须是这个确切的方法? –
哈希将按顺序排列,但以数字而非字母。问题是一样的,但改变键名不是必须的。基本上我只需要从一个键到下一个键就能获得所有的价值。我知道我可以创建一个临时变量并保存每个键的值,然后转到下一个键并覆盖它们,但这看起来更像是一种数组类型的任务。 –