如何实现Hash值累加处理:首值加100,后续值加前序结果?
实现方案
当然有合适的实现方式啦!针对你的需求,这里提供几种Ruby风格的解法,核心都是跟踪前一个处理后的结果——毕竟每一步的计算都依赖上一步的输出:
方法一:each_with_object+状态变量(最直观)
h = { a: 1, b: 1, c: 1, d: 2, e: 2 } previous_result = nil processed_h = h.each_with_object({}) do |(key, value), result| current = if previous_result.nil? value + 100 else previous_result + value end result[key] = current previous_result = current end p processed_h # 输出:{:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}
解释
- 用
each_with_object遍历原哈希,同时构建新的结果哈希 previous_result专门用来保存上一个处理后的数值,初始为nil表示还没处理任何元素- 第一个元素直接给原数值加100,后续元素则用上一个结果加当前原数值,最后更新状态变量
方法二:inject(更简洁的惯用写法)
h = { a: 1, b: 1, c: 1, d: 2, e: 2 } processed_h = h.inject({}) do |acc, (key, value)| acc[key] = acc.empty? ? value + 100 : acc.values.last + value acc end p processed_h # 输出:{:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}
解释
inject(别名reduce)的累加器acc就是我们最终要的结果哈希- 通过判断
acc是否为空来区分第一个元素和后续元素:空的时候处理第一个元素,否则取acc最后一个值(前一个处理结果)计算 - 每一步都要返回累加器,这是
inject的核心要求
方法三:each_with_index(新手友好)
h = { a: 1, b: 1, c: 1, d: 2, e: 2 } processed_h = {} previous = nil h.each_with_index do |(key, val), idx| if idx == 0 processed_h[key] = val + 100 else processed_h[key] = previous + val end previous = processed_h[key] end p processed_h # 输出:{:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}
解释
- 用索引直接判断是否是第一个元素,逻辑非常直白
- 同样用
previous变量跟踪上一步的处理结果,适合刚接触Ruby循环的开发者
这几种方法都能完美得到你想要的结果,其中前两种是Ruby社区比较推荐的写法,代码更简洁且符合Ruby的惯用风格。
内容的提问来源于stack exchange,提问作者Selim Alawwa
相关产品推荐
相关产品推荐

