Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Arrays 如何将具有重复键的哈希数组“减少”为嵌套哈希?_Arrays_Ruby_Hash - Fatal编程技术网

Arrays 如何将具有重复键的哈希数组“减少”为嵌套哈希?

Arrays 如何将具有重复键的哈希数组“减少”为嵌套哈希?,arrays,ruby,hash,Arrays,Ruby,Hash,注意:关于这一点,有一些类似的问题,比如 还有,但没有一个像我要找的那样 假设我有一个如下哈希数组: arr_with_dup_hsh_keys = [ { foo: "dup", bar: 1 }, { foo: "dup", bar: 2 }, { foo: "dup", bar: 3 }, { foo: "dup", bar: 4 }, { foo: "dup", bar: 5 } ] 我怎样才能把它减少到这个程度呢 { foo: "dup", bars: [1, 2

注意:关于这一点,有一些类似的问题,比如 还有,但没有一个像我要找的那样

假设我有一个如下哈希数组:

arr_with_dup_hsh_keys = [
  { foo: "dup", bar: 1 },
  { foo: "dup", bar: 2 },
  { foo: "dup", bar: 3 },
  { foo: "dup", bar: 4 },
  { foo: "dup", bar: 5 }
]
我怎样才能把它减少到这个程度呢

{ foo: "dup", bars: [1, 2, 3, 4, 5] }
如果foo有不同的值呢


如果您的数据真的像您的问题一样简单,这将满足您的要求:

{ foo: "dup",
  bars: arr_with_dup_hsh_keys.map {|hsh| hsh[:bar] }
}

如果您的数据真的像您的问题一样简单,这将满足您的要求:

{ foo: "dup",
  bars: arr_with_dup_hsh_keys.map {|hsh| hsh[:bar] }
}
看到并注意到

arr_with_dup_hsh_keys1.group_by { |g| g[:foo] }
 #=> {"dup"=> [{:foo=>"dup", :bar=>1}, {:foo=>"dup", :bar=>2},
 #             {:foo=>"dup", :bar=>4}],
 #    "soup"=>[{:foo=>"soup", :bar=>3}, {:foo=>"soup", :bar=>5}]}
您也可以编写以下内容

def combine(arr)
  arr.each_with_object({}) do |g,h|
    f = g.merge(bar: [g[:bar]])
    h.update(f[:foo]=>f) { |_,o,n| { foo: o[:foo], bar: o[:bar]+n[:bar] } }
  end.values
end

combine arr_with_dup_hsh_keys1
  #=> [{:foo=>"dup", :bar=>[1, 2, 4]}, {:foo=>"soup", :bar=>[3, 5]}] 
这使用了aka合并的形式!它使用一个块来确定合并的两个哈希中存在的键的值。关于三个块变量的解释,请参见文档,第一个是公共键,我用下划线表示它不用于块计算

看到并注意到

arr_with_dup_hsh_keys1.group_by { |g| g[:foo] }
 #=> {"dup"=> [{:foo=>"dup", :bar=>1}, {:foo=>"dup", :bar=>2},
 #             {:foo=>"dup", :bar=>4}],
 #    "soup"=>[{:foo=>"soup", :bar=>3}, {:foo=>"soup", :bar=>5}]}
您也可以编写以下内容

def combine(arr)
  arr.each_with_object({}) do |g,h|
    f = g.merge(bar: [g[:bar]])
    h.update(f[:foo]=>f) { |_,o,n| { foo: o[:foo], bar: o[:bar]+n[:bar] } }
  end.values
end

combine arr_with_dup_hsh_keys1
  #=> [{:foo=>"dup", :bar=>[1, 2, 4]}, {:foo=>"soup", :bar=>[3, 5]}] 

这使用了aka合并的形式!它使用一个块来确定合并的两个哈希中存在的键的值。有关三个块变量的解释,请参见文档,第一个是公共键,我用下划线表示它在块计算中未使用。

这就是我提出的:

a = [
  { foo: "dup", bar: 1 },
  { foo: "dup", bar: 2 },
  { foo: "dup", bar: 3 },
  { foo: "dup", bar: 4 },
  { foo: "dup", bar: 5 }
]

h = {}
a.map(&:keys).uniq.flatten.each_with_index do |key, idx|
  h[key] = a.map(&:values).collect { |a| a[idx]}.uniq
end
h
#=> {:foo=>["dup"], :bar=>[1, 2, 3, 4, 5]}

这就是我想到的:

a = [
  { foo: "dup", bar: 1 },
  { foo: "dup", bar: 2 },
  { foo: "dup", bar: 3 },
  { foo: "dup", bar: 4 },
  { foo: "dup", bar: 5 }
]

h = {}
a.map(&:keys).uniq.flatten.each_with_index do |key, idx|
  h[key] = a.map(&:values).collect { |a| a[idx]}.uniq
end
h
#=> {:foo=>["dup"], :bar=>[1, 2, 3, 4, 5]}

你尝试过什么吗?是的,我尝试过多次使用group|U by和inject,但都没有达到我想要的效果。{foo:dup,bars:arr_with_dup|hsh|h[:bar]}。@binarymason完成了。你尝试过什么吗?是的,我尝试了多次使用group|by和inject的尝试,但都没有达到我想要达到的效果。{foo:dup,bar:arr_with_dup_hsh_keys.map{| hsh | hsh[:bar]}。@binarymason完成。数据真的没有那么简单。我可能有数百个具有一系列值的foo,其中许多都是重复的,就像上面的例子一样。我可能有数百个具有一系列值的foo,其中许多是重复的,如上面的示例。这正是我所需要的。你们一定已经意识到我还需要区分什么时候食物可以是酒吧或汤。非常感谢。我最初使用group_by,但遇到了麻烦,因为这又创建了一个数组级别。您将如何继续使用group_by的方法?如果你不介意的话,我只是用乔丹的答案,用这个方法得到的。这也是另一种选择。再次感谢你!正如你们所看到的,我已经展示了这两种方法是如何使用的,其中一种方法使用的是group_,你们也认为这是首选方法。这正是我所需要的。你们一定已经意识到我还需要区分什么时候食物可以是酒吧或汤。非常感谢。我最初使用group_by,但遇到了麻烦,因为这又创建了一个数组级别。您将如何继续使用group_by的方法?如果你不介意的话,我只是用乔丹的答案,用这个方法得到的。这也是另一种选择。再次感谢你!正如您所看到的,我已经展示了如何使用这两种方法,其中一种方法使用group_,您也认为这是首选方法。