Ich ziehe diese array
-hash
für eine bessere maping nasted zu ändern.
Eingang
arr = [
{"__content__" => "Guitars", "id" => "2"},
{"__content__" => "For Guitars", "id" => "3", "parentId" => "2"},
{"__content__" => "6-string", "id" => "24", "parentId" => "2"},
{"__content__" => "7-string", "id" => "25", "parentId" => "2"},
{"__content__" => "8-string", "id" => "26", "parentId" => "2"}
]
erstellen Eltern
parents = arr.each_with_object({}) { |h, exp| exp[h['id']] = h['__content__'] }
Nach dieser guten Map-Struktur können Sie einfach map
Methode verwenden.
Prozess
output = arr.map do |h|
h['parentId'] = parents[h['parentId']] if h['parentId'] && parents[h['parentId']]
h
end
Ausgang
p output
# [
# {"__content__" => "Guitars", "id" => "2"},
# {"__content__" => "For Guitars", "id" => "3", "parentId" => "Guitars"},
# {"__content__" => "6-string", "id" => "24", "parentId" => "Guitars"},
# {"__content__" => "7-string", "id" => "25", "parentId" => "Guitars"},
# {"__content__" => "8-string", "id" => "26", "parentId" => "Guitars"}
# ]
Ich hoffe, das hilft.
EDIT
Sie auch auf diese Weise
Art von ID verwenden können
arr.sort_by! { |h| h['id'] }
Prozess
output = arr.each_with_object({}) do |h, exp|
exp[h['id']] = h
h['parentId'] = exp[h['parentId']]['__content__'] if h['parentId'] && exp[h['parentId']]
h
end
danach werden Sie Hash mit id haben wie Schlüssel, so dass für die Ausgabe:
Ausgang
p output.values
# [
# {"__content__"=>"Guitars", "id"=>"2"},
# {"__content__"=>"6-string", "id"=>"24", "parentId"=>"Guitars"},
# {"__content__"=>"7-string", "id"=>"25", "parentId"=>"Guitars"},
# {"__content__"=>"8-string", "id"=>"26", "parentId"=>"Guitars"},
# {"__content__"=>"For Guitars", "id"=>"3", "parentId"=>"Guitars"}
# ]
Also Wert von '__content__' muss in' parentId' gehen? – Roger