2017-02-15 8 views
0

У меня есть два массиваСравнение двух массивов и комбинируя их Рубин

arr1 = [[["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"], ["species", "Alex"], ["female", "yes"], ["group"]], [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"], ["species", "cat"], ["female", "no"], ["group"]]] 

arr2 = [["A23", "All", "Katy", "Max"], ["B23", "Sisi", "Alex"]] 

и если имя, например. значение Alex form arr2 похоже на значение Alex из arr1, значение B23 из arr2 подталкивается в subarray ["group"] к первому массиву. Поэтому я хочу получить

arr1 = [[["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"], ["species", "Alex"], ["female", "yes"], ["group", "B23"]], [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"], ["species", "cat"], ["female", "no"], ["group", "A23"]]] 

Как сравнить и объединить эти массивы?

+0

Вам действительно нужно использовать эту структуру данных? Это было бы намного лучше представлено хэш-объектом. –

+0

К сожалению, да ... – mila002

+0

Что вы попробовали? –

ответ

1

Вы не указали какой-либо код, поэтому я не буду писать полное решение. Как заметил @EddeAlmeida, было бы намного проще работать с массивом хэшей. Вот базовую структуру, чтобы преобразовать данные вперед и назад:

require 'pp' 

arr1 = [[["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"], ["species", "Alex"], ["female", "yes"], ["group"]], [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"], ["species", "cat"], ["female", "no"], ["group"]]] 

arr2 = [["A23", "All", "Katy", "Max"], ["B23", "Sisi", "Alex"]] 

data = arr1.map { |a| a.tap { |x| x.last[1] = '' }.to_h } 

pp data 
# [{"name"=>"Alex", 
# "age"=>"4", 
# "width"=>"55", 
# "weight"=>"30", 
# "species"=>"Alex", 
# "female"=>"yes", 
# "group"=>""}, 
# {"name"=>"All", 
# "age"=>"7", 
# "width"=>"26", 
# "weight"=>"3", 
# "species"=>"cat", 
# "female"=>"no", 
# "group"=>""}] 

arr2.each do |code, *names| 
    # add some logic here 
end 

# Coming back to (weird) nested arrays : 
p data.map{|h| h.to_a} 
0

Я сделал это так:

arr1.each do |data| 
    a = data[0][1] 
    b = "" 
    arr2.each do |x| 
     if (x.include?(a)) then 
      b << "#{x[0]} " 
     end 
    end 
data[6].push(b) 

конец

0
arr1 = [ 
     [["name", "Alex"],["age", "4"], ["width", "55"], ["weight", "30"], 
     ["species", "Alex"], ["female", "yes"], ["group"]], 
     [["name", "All"],["age", "7"], ["width", "26"], ["weight", "3"], 
     ["species", "cat"], ["female", "no"], ["group"]] 
     ] 

arr2 = [["A23", "All", "Katy", "Max"], ["B23", "Sisi", "Alex"]] 

Вот способ, который позволяет элементы каждого элемента arr1 быть в любом порядке и поддерживает этот порядок после изменения элемента, содержащего "group".

h2 = arr2.each_with_object({}) { |(first,*rest),h| rest.each { |s| h[s] = first } } 
    #=> {"All"=>"A23", "Katy"=>"A23", "Max"=>"A23", "Sisi"=>"B23", "Alex"=>"B23"} 

arr1.map do |a| 
    h = a.each_with_object({}) { |(k,v),h| h[k]=v } 
    h["group"] = h2[h["name"]] 
    h.to_a 
end 
    #=> [[["name", "Alex"], ["age", "4"], ["width", "55"], ["weight", "30"], 
    #  ["species", "Alex"], ["female", "yes"], ["group", "B23"]], 
    # [["name", "All"], ["age", "7"], ["width", "26"], ["weight", "3"], 
    #  ["species", "cat"], ["female", "no"], ["group", "A23"]]] 

Использование Array#map если arr1 не будет мутировали.

Расчет блока для первого из двух элементов arr1 выглядит следующим образом.

a = arr1.first 
    #=> [["name", "Alex"], ["age", "4"], ["width", "55"], ["weight", "30"], 
    # ["species", "Alex"], ["female", "yes"], ["group"]] 
h = a.each_with_object({}) { |(k,v),h| h[k]=v } 
    #=> {"name"=>"Alex", "age"=>"4", "width"=>"55", "weight"=>"30", 
    # "species"=>"Alex", "female"=>"yes", "group"=>nil} 
v = h["name"] 
    #=> "Alex" 
h["group"] = h2[v] 
    #=> h2["Alex"] => "B23" 
h #=> {"name"=>"Alex", "age"=>"4", "width"=>"55", "weight"=>"30", 
    # "species"=>"Alex", "female"=>"yes", "group"=>"B23"} 
h.to_a 
    #=> [["name", "Alex"], ["age", "4"], ["width", "55"], ["weight", "30"], 
    # ["species", "Alex"], ["female", "yes"], ["group", "B23"]] 

Расчет аналогичен для второго элемента arr1.