Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何为一个键连接不同的值_Ruby - Fatal编程技术网

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 }
这使用了(aka
merge!
)的形式,它使用一个块来确定合并的两个哈希中存在的键的值。那个街区是

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]}} 
这使用了(aka
merge!
)的形式,它使用一个块来确定合并的两个哈希中存在的键的值。那个街区是

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中首次出现,这也会起作用(感谢《代码>阵列γ图!< /代码>)!斯特凡波克