Considere a seguinte matriz de objetos:
[
{v: 'a'},
{v: 'b'},
{v: 'c', ptr: 'b'},
{v: 'd', ptr: 'a'},
{v: 'e'},
]
Alguns dos objetos contêm uma ptr
propriedade, referenciando o v
valor da propriedade de um objeto que deve preceder diretamente. Dois objetos nunca tentarão preceder diretamente o mesmo objeto e nunca haverá um loop (por exemplo, a->b->c->a) no array.
Portanto, aqui estão dois possÃveis rearranjos válidos dos objetos:
[
{v: 'e'},
{v: 'd', ptr: 'a'},
{v: 'a'},
{v: 'c', ptr: 'b'},
{v: 'b'},
]
[
{v: 'c', ptr: 'b'},
{v: 'b'},
{v: 'd', ptr: 'a'},
{v: 'a'},
{v: 'e'}
]
Não importa onde os objetos aparecem na saÃda, se não houver nenhuma ptr
propriedade que faça referência a eles. Tudo o que importa é que certos objetos precedam diretamente outros onde a ptr
propriedade o solicita.
Qual é um algoritmo razoavelmente eficiente para realizar esse tipo de rearranjo?
Embora seja garantido que os dados não contenham loops, o rearranjo deve ter cuidado para não entrar em um loop infinito onde fica reorganizando os objetos para sempre.
Observe que, embora esses exemplos usem strings para v
e ptr
, o aplicativo real envolverá elementos DOM como valores para v
e ptr
referências. Portanto, a solução só deve ser capaz de comparar propriedades v
e ptr
igualdade.
Descubra quais objetos têm outro objeto apontando para eles. Então, para cada objeto que não possui outro objeto apontando para ele, adicione esse objeto e tudo na seguinte cadeia ptr à saÃda:
Eu sei que isso foi respondido, mas ainda quero postar o meu: p
Adicionadas mais algumas cadeias para teste também. A raiz de cada cadeia é onde a cadeia resultante se originará, portanto, mesmo que a cadeia que começa em c seja definida antes do g desencadeado, o último elemento i é a raiz da cadeia c, portanto, toda a sua cadeia está posicionada lá.
Colete itens
ptr
e copie a entrada inserindoptr
itens antes de seus alvos:E uma referência: