Как объединить определенные массивы в многомерный массив? - PullRequest
1 голос
/ 11 июля 2019

У меня есть вложенный массив, и мне нужно объединить внутренние массивы, которые равны, за исключением последних элементов, как показано ниже.

_array = [["Nokia","Review","3"], ["Nokia","Review","2"],
          ["Samsung","Review","4"], ["Apple","Review","4"],
          ["Apple","Review","3"]]

Желаемый вывод:

[["Nokia","Review","5"], ["Samsung","Review","4"], ["Apple","Review","7"]]

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Один вкладыш, просто для удовольствия:

_array.group_by{ |e| e.first(2) }
      .transform_values { |v| v.sum { |e| e.last.to_i } }
      .map { |k, v| k << v.to_s }

#=> [["Nokia", "Review", 5], ["Samsung", "Review", 4], ["Apple", "Review", 7]]


Несколько шагов, помогающих понять
_array.group_by{ |e| e.first(2) }
#=> {["Nokia", "Review"]=>[["Nokia", "Review", "3"],["Nokia", "Review", "2"]],
#    ["Samsung", "Review"]=>[["Samsung", "Review", "4"]],
#    ["Apple", "Review"]=>[["Apple", "Review", "4"], ["Apple", "Review", "3"]]}

_array.group_by{ |e| e.first(2) }.transform_values { |v| v.sum { |e| e.last.to_i } }
#=> {["Nokia", "Review"]=>5, ["Samsung", "Review"]=>4, ["Apple", "Review"]=>7}

Тогда map.

3 голосов
/ 11 июля 2019

Это действительно странная форма, поскольку числа являются строками, но вы можете просто накопить с небольшим количеством преобразования:

array = [["Nokia","Review","3"], ["Nokia","Review","2"], ["Samsung","Review","4"], ["Apple","Review","4"], ["Apple","Review","3"]]

# Define a tabulator Hash defaulting to count of 0
array.each_with_object(Hash.new(0)) do |a,h|
  # Use the first two elements of the array as the key
  h[a[0,2]] += a[2].to_i
end.map do |k, v|
  # Convert back to string value, combining key and count
  k + [ v.to_s ]
end

# => [["Nokia", "Review", "5"], ["Samsung", "Review", "4"], ["Apple", "Review", "7"]]

Как видите, было бы намного проще, если бы данные были в другой форме, или даже если числа были на самом деле целыми числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...