通过唯一键在Ruby中合并两个数组

Geo*_*Com 1 ruby arrays

如何将两个数组合并为唯一key:

keyList = ["a", "b", "c", "d"]

keyValueList = [
  ["a", [1, 2, 3]],
  ["a", [4, 5, 6]],
  ["b", [5, "a", 3]],
  ["b", ["test", 4, 3]],
  ["c", [1, "number", 110]]
]
Run Code Online (Sandbox Code Playgroud)

得到以下?

[
  ["a", [[1, 2, 3], [4, 5, 6]]],
  ["b", [[5, "a", 3], ["test", 4, 3]]],
  ["c", [[1, "number", 110]]]
]
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 7

用途Enumerable#group_by:

keyValueList.
  map(&:flatten).
  group_by(&:shift).
  select { |k, _| keyList.include?(k) }.
  to_a
#? [["a", [[1, 2, 3], [4, 5, 6]]],
#   ["b", [[5, "a", 3], ["test", 4, 3]]],
#   ["c", [[1, "number", 110]]]
Run Code Online (Sandbox Code Playgroud)


Car*_*and 5

目前尚不清楚为什么keyList需要阵列.

keyValueList.each_with_object(Hash.new {|h,k| h[k]=[]}) do |(k,arr),h|
  h[k] << arr
end.to_a
  #=> [["a", [[1, 2, 3], [4, 5, 6]]],
  #    ["b", [[5, "a", 3], ["test", 4, 3]]],
  #    ["c", [[1, "number", 110]]]]
Run Code Online (Sandbox Code Playgroud)

h[k] << arrh[k] << arr if keyList.include?(k)如果需要,可以更改为所需的行为.

以上也可以写成如下.

keyValueList.each_with_object({}) do |(k,arr),h|
  (h[k] ||= []) << arr
end.to_a
Run Code Online (Sandbox Code Playgroud)

  • @sawa我肯定不会责怪卡里.整个问题是如此糟糕(甚至是格式不佳),我在答案中字面上是出于怜悯.我只是指出了这一点. (2认同)