{:price => 3.0, :cleara-6ren">
gpt4 book ai didi

ruby - 如何将哈希数组转换为单个哈希并计算重复项?

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:40 25 4
gpt4 key购买 nike

我有一个散列数组,我基本上想合并并转换为单个散列,同时我想计算键值对出现的次数。

原数组为

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com