Ruby 如何为一个键连接不同的值
我有一个麻烦好几天了,我需要帮助来解决它。 我有一个哈希,同一个键有多个值:Ruby 如何为一个键连接不同的值,ruby,Ruby,我有一个麻烦好几天了,我需要帮助来解决它。 我有一个哈希,同一个键有多个值: {"answers": [ {"id":1,"value":true}, {"id":3,"value":false}, {"id":2,"value":3}, {"id":1,"value":false}, {"id":2,"value":false}, {"id":2,"value":1} ] } 我想要一个方法,将一个键的所有值分组,例如: { "a
{"answers":
[
{"id":1,"value":true},
{"id":3,"value":false},
{"id":2,"value":3},
{"id":1,"value":false},
{"id":2,"value":false},
{"id":2,"value":1}
]
}
我想要一个方法,将一个键的所有值分组,例如:
{
"answers": [
{
"id":1, "value": [true, false]
},
{
"id":3, "value": [false]
},
{
"id":2, "value":[3, false, 1]
}
]
}
我尝试过使用reduce方法,但找不到将值链接到键的方法。
有人能帮我吗?
谢谢 看起来您希望通过每个哈希中的:id
键重新组合哈希数组
此方法接受answers数组并返回一个新的转换后的answers数组:
def transform_answers(answers)
answers
.group_by { |h| h[:id] }
.each_value { |a| a.map! { |h| h[:value] } }
.map { |id, value| { id: id, value: value } }
end
您可以这样使用它:
hash = {
answers: [
{ id: 1, value: true },
{ id: 1, value: false },
{ id: 2, value: 3 },
{ id: 2, value: false },
{ id: 2, value: 1 },
{ id: 3, value: false }
]
}
transformed_answers = transform_answers(hash[:answers]) # => [{:id=>1, :value=>[true, false]}, {:id=>2, :value=>[3, false, 1]}, {:id=>3, :value=>[false]}]
您可以轻松地获取转换后的答案,并将其放回类似于原始输入的散列中:
transformed_hash = { answers: transformed_answers }
看起来您希望通过每个哈希中的:id
键重新组合哈希数组
此方法接受answers数组并返回一个新的转换后的answers数组:
def transform_answers(answers)
answers
.group_by { |h| h[:id] }
.each_value { |a| a.map! { |h| h[:value] } }
.map { |id, value| { id: id, value: value } }
end
您可以这样使用它:
hash = {
answers: [
{ id: 1, value: true },
{ id: 1, value: false },
{ id: 2, value: 3 },
{ id: 2, value: false },
{ id: 2, value: 1 },
{ id: 3, value: false }
]
}
transformed_answers = transform_answers(hash[:answers]) # => [{:id=>1, :value=>[true, false]}, {:id=>2, :value=>[3, false, 1]}, {:id=>3, :value=>[false]}]
您可以轻松地获取转换后的答案,并将其放回类似于原始输入的散列中:
transformed_hash = { answers: transformed_answers }
这使用了(akamerge!
)的形式,它使用一个块来确定合并的两个哈希中存在的键的值。那个街区是
do |_k,o,n|
{ id: o[:id], value: o[:value]+n[:value] }
end
有关三个块变量、\u k
、o
和n
的定义,请参见update
文档。我编写了第一个块变量(公共键)\u k
,而不是k
,以表示它不用于块计算
注意,在doit
中执行values
之前,该方法构造了以下哈希
{1=>{:id=>1, :value=>[true, false]},
2=>{:id=>2, :value=>[3, false, 1]},
3=>{:id=>3, :value=>[false]}}
这使用了(akamerge!
)的形式,它使用一个块来确定合并的两个哈希中存在的键的值。那个街区是
do |_k,o,n|
{ id: o[:id], value: o[:value]+n[:value] }
end
有关三个块变量、\u k
、o
和n
的定义,请参见update
文档。我编写了第一个块变量(公共键)\u k
,而不是k
,以表示它不用于块计算
注意,在doit
中执行values
之前,该方法构造了以下哈希
{1=>{:id=>1, :value=>[true, false]},
2=>{:id=>2, :value=>[3, false, 1]},
3=>{:id=>3, :value=>[false]}}
它是一样的,我不想写下来,但我会更新它。现在应该可以了。对不起,我的错误。“我找不到方法”不是一个足够精确的错误描述,我们无法帮助您。什么不起作用?它怎么不起作用?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们以什么方式不同?您能否提供您希望发生的行为的精确说明,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请同时提供一个“我找不到办法”——你可以通过编写一个程序来实现。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行情况,在调试器中单步执行,然后对其进行休眠,从头开始,再次休眠,然后,也只有到那时,才能把你的问题缩小到一个简洁、集中、简单、简短、可重复的范围,然后问一个集中、狭窄的问题。这是一样的,我不想写下来,但我会更新它。现在应该可以了。对不起,我的错误。“我找不到方法”不是一个足够精确的错误描述,我们无法帮助您。什么不起作用?它怎么不起作用?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们以什么方式不同?您能否提供您希望发生的行为的精确说明,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请同时提供一个“我找不到办法”——你可以通过编写一个程序来实现。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行情况,在调试器中单步执行,然后对其进行休眠,从头开始,再次休眠,然后,也只有到那时,才能把你的问题缩小到一个简洁、集中、简单、简短、可重复的范围,然后问一个集中、狭窄的问题。@StefanPochmann,这也行得通(多亏了
数组#映射!
)@StefanPochmann我决定将你的建议用于整体解决方案。再次感谢。呵呵:-)。我也喜欢你的另一个“老红宝石”解决方案,这是我自己写的。但它看起来不太好,嵌套得有点太深了。我开始觉得语法比它解决的问题多,但我知道它是主要的标准,所以我会更新我的答案。考虑使用,它在Ruby V2.4.@ StFaunPokman中首次出现,这也会起作用(感谢《代码>阵列γ图!< /代码>)!斯特凡波克