作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
{:price => 3.0, :cleara-6ren">
我有一个散列数组,我基本上想合并并转换为单个散列,同时我想计算键值对出现的次数。
原数组为
cart_items = [
{"AVOCADO" => {:price => 3.0, :clearance => true }},
{"AVOCADO" => {:price => 3.0, :clearance => true }},
{"KALE" => {:price => 3.0, :clearance => false}}
]
我已经试过了,但是我没有得到我想要的。我的尝试如下,如果有人能解释我哪里出错了,那就太好了。
我对这个问题的尝试是这样的。
def consolidate_cart(items)
### the cart starts as an array of items
## convert the array into a hash`
hashed_items = items.inject(:merge!)
hashed_items.map{|k,v| {k => v, :count => v.length}}
end
consolidate_cart(cart_items)
我希望输出是
{
"AVOCADO" => {:price => 3.0, :clearance => true, :count => 2},
"KALE" => {:price => 3.0, :clearance => false, :count => 1}
}
但是我得到了输出
[{"AVOCADO"=>{:price=>3.0, :clearance=>true}, :count=>2}, {"KALE"=>{:price=>3.0, :clearance=>false}, :count=>2}]
最佳答案
您可以合并到 v
(在 map
调用中)count 的值 (v.merge(:count => v.length)
), 所以这会将计数键添加到 v
散列中,你会得到如下内容:
[
{"AVOCADO"=>{:price=>3.0, :clearance=>true, :count=>2},
{"KALE"=>{:price=>3.0, :clearance=>false, :count=>2}
]
但是无论如何 :count
的值都会出错。
另一方面,您可以从 cart_items 中的每个散列中获取所有键,合并散列,然后将一个新键与存储的键数组中该键的计数合并:
def consolidate_cart(items)
items_keys = items.flat_map(&:keys)
items.inject(:merge).map do |key, value|
{ key => value.merge(count: items_keys.count(key)) }
end
end
p consolidate_cart(cart_items)
# [{"AVOCADO"=>{:price=>3.0, :clearance=>true, :count=>2}}, {"KALE"=>{:price=>3.0, :clearance=>false, :count=>1}}]
方法运行的部分 View :
您映射每个哈希项的键 (items.flat_map(&:keys)
):
["AVOCADO", "AVOCADO", "KALE"]
您在 items
中合并哈希(items.inject(:merge)
):
{"AVOCADO"=>{:price=>3.0, :clearance=>true}, "KALE"=>{:price=>3.0, :clearance=>false}}
当您迭代之前生成的散列时,您将计数键合并到每个散列值 ({ key => value.merge(count: items_keys.count(key)) }
):
# {:price=>3.0, :clearance=>true}
# {:count=>2}
# => {:price=>3.0, :clearance=>true, :count => 2}
我已经看到我的答案与预期输出不符。这样做:
def consolidate_cart(items)
items.inject(:merge).each_with_object(items: items.flat_map(&:keys)) do |(k, v), hash|
hash[k] = v.merge(count: hash[:items].count(k))
end.reject { |k, _| k == :items }
end
关于ruby - 如何将哈希数组转换为单个哈希并计算重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667059/
我是一名优秀的程序员,十分优秀!