我有一个这样的项目数组:
items = [{name: 'item_1', qty: 1, unit_price: 5},
{name: 'item_1', qty: 2, unit_price: 5},
{name: 'item_2', qty: 3, unit_price: 10},
{name: 'item_2', qty: 2, unit_price: 10}]
我想通过对数量求和将具有相同名称的项目合并到一个散列中。上面示例的预期输出应为:
[{name: 'item_1', qty: 3, unit_price: 5},
{name: 'item_2', qty: 5, unit_price: 10}]
4条答案
按热度按时间pcrecxhr1#
这使用Hash#update(又名
merge!
)的形式,它使用一个块({ |_k,o,n| o.merge(qty: o[:qty] + n[:qty]) }
)来计算合并的两个哈希中存在的键的值。g[:name]=>g
,当它作为参数出现时(如这里),是简写(并等效于){ g[:name]=>g }
。块变量_k
的名称,它保存公共键,以下划线开始,向读者表示它不用于块计算。通常将这样的块变量表示为简单的_
(局部变量的有效名称)。items
没有突变。我们可以添加一些
puts
语句来检查示例的计算。以下是打印出来的(经过一些手工重新格式化)。
请注意,当
items
的第一个和第三个元素传递到外部块时,不会查询update
的块,这是因为h
还不包含键g[:name]
。请参见对象#tap。
pdkcd3nj2#
输入
代码
输出
nhn9ugyo3#
这使用双splat操作符来复制哈希,并在第一次填充累加器哈希中的名称条目时将数量设置为零。
w1e3prcc4#
你可以从这里开始,找到一个最优解