Чтобы получить разницу между подмассивами, вам нужно будет выполнить итерацию.Я считаю, что это предлагает лучшее решение для краткости и производительности, поскольку другие имеют дело с плоскими массивами, оставляют ненужные элементы или повторяются несколько раз.
Вот как:
Если вы используете Ruby 2.7:
a = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["005", 1, 1434, "buve", "eka", 27, "110A"], ["008", 1, 1111, "maja", "", 31, "110"]]
b = [["001", 1, 3333, "maja", "eka", 17, "110B"], ["007", 1, 3381, "buve", "eka", 31, "110"], ["009", 1, 2824, "maja", "", 28, "110C"]]
a.map.with_index { |arr, i| b[i].difference(arr) }
# => [[], ["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]
или до 2.7:
a.map.with_index { |arr, i| b[i] - arr }
# => [[], ["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]
Если вам нужно избегатьПри появлении пустых массивов, где результаты совпадают, вы можете немного подправить:
# Ruby 2.7
a.filter_map.with_index do |arr, i|
diff = b[i].difference(arr)
diff if diff.any?
end
# => [["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]
# < Ruby 2.7
a.each_with_object([]).with_index do |(arr, results), i|
diff = b[i] - arr
results << diff if diff.any?
end
# => [["007", 3381, 31, "110"], ["009", 2824, 28, "110C"]]
Надеюсь, что это поможет - дайте мне знать, как вы поживаете, или если у вас есть какие-либо вопросы.