Organize object in Javascript

2

I have the following object:

objTeste = [
  {
    "id": "03",
    "nome": "teste03",
    "pai": {
      "id": "02",
      "nome": "teste02",
      "pai": {
        "id": "01",
        "nome": "teste01"
      }
    }
  },
  {
    "id": "02",
    "nome": "teste02",
    "pai": {
      "id": "01",
      "nome": "teste01"
    }
  },
  {
    "id": "01",
    "nome": "teste01"
  }
]

I'm trying to organize this object by the child that brings its relatives inside it, but I want to ignore their relatives when it is stored in another object.

Example:

I want to store only the following object:

{
    "id": "03",
    "nome": "teste03",
    "pai": {
      "id": "02",
      "nome": "teste02",
      "pai": {
        "id": "01",
        "nome": "teste01"
      }
    }
  }

on another object by ignoring the rest of the object. I'm using JavaScript to organize this object.

Can anyone help me?

    
asked by anonymous 09.04.2016 / 23:49

3 answers

2

If you understand correctly, you do not want elements that already appear as the parent of another element to be present as elements in the parent vector, avoiding repeating elements.

If this is the case, you can do it in two steps:

  • Scroll through all elements and store the parent elements of other elements
  • Delete those that are parents from the vector, so they already appear in another element
  • The function below does this:

    function normalizar(vetor) {
        //construir um mapa com elementos que são pai 
        var mapa = {};
        function indexarItem(item) {
            if ('pai' in item) {
                mapa[item['pai']['id']] = item['id'];
                indexarItem(item['pai']);
            }
        }
        vetor.forEach(indexarItem);
        //remover elementos do vetor que sejam pai
        function naoEhPai(item) {
                return !(item['id'] in mapa);
        }
        return vetor.filter(naoEhPai);
    }
    

    You can see the working example in JSFiddle .

        
    13.04.2016 / 03:26
    0

    This may not be your case, but you may be able to use cycle.js , with it you can point to a reference object, not object in sim.

    This library can also be useful if you want to make a JSON.stringify on a circular reference object.

    var pessoas = [  
      //pessoas[0]: "$ref": "$[0]"
      {
        "ID": 1,
        "Nome": "Teste 01",
        "Conjugue": { "$ref": "$[1]" },
        "Pai": null,
        "Mae": null,
        "Filhos": [{ "$ref": "$[2]" }, { "$ref": "$[3]" }, { "$ref": "$[4]" } ],
        "Irmaos": null
      },
      //pessoas[1]: "$ref": "$[1]"
      {
        "ID": 2,
        "Nome": "Teste 02",
        "Conjugue": { "$ref": "$[0]" },
        "Pai": null,
        "Mae": null,
        "Filhos":  [{ "$ref": "$[2]" }, { "$ref": "$[3]" }, { "$ref": "$[4]" } ],
        "Irmaos": null
      },
      //pessoas[2]: "$ref": "$[2]"
      {
        "ID": 3,
        "Nome": "Teste 03",
        "Conjugue": null,
        "Pai": { "$ref": "$[0]" },
        "Mae": { "$ref": "$[1]" },
        "Filhos": null,
        "Irmaos": [{ "$ref": "$[3]" }, { "$ref": "$[4]" }]
      },
      //pessoas[3]: "$ref": "$[3]"
      {
        "ID": 4,
        "Nome": "Teste 04",
        "Conjugue": null,
        "Pai": { "$ref": "$[0]" },
        "Mae": { "$ref": "$[1]" },
        "Filhos": null,
        "Irmaos": [{ "$ref": "$[2]" }, { "$ref": "$[4]" }]
      },
      //pessoas[4]: "$ref": "$[4]"
      {
        "ID": 5,
        "Nome": "Teste 05",
        "Conjugue": null,
        "Pai": { "$ref": "$[0]" },
        "Mae": { "$ref": "$[1]" },
        "Filhos": null,
        "Irmaos": [{ "$ref": "$[2]" }, { "$ref": "$[3]" }]
      }
    ];
    
    var _pessoas = JSON.retrocycle(pessoas);
    
    console.log(_pessoas);
    
    console.log(JSON.stringify(JSON.decycle(_pessoas)));
    <script src="https://cdn.rawgit.com/douglascrockford/JSON-js/master/cycle.js"></script>

    Someserver-sidelibraries,suchas Newtonsoft.Json for C# use an approach similar to solve for circular reference problems, however in this case the $ref does not point to the Path of the object, but to the object with the property $id with the same value.

    In any case, you can adapt the Douglas Crockfords script to work the same way.

    In this case json would be something similar to:

    using System;
    using Newtonsoft.Json;
    
    public class Pessoa
    {
        public int ID { get; set; }
        public string Nome { get; set; }
        public Pessoa Conjugue { get; set; }
        public Pessoa Pai { get; set; }
        public Pessoa Mae { get; set; }
        public Pessoa[] Filhos { get; set; }
        public Pessoa[] Irmaos { get; set; }
    }
    
    public class Program
    {
        public static void Main()
        {
            var pessoas = new Pessoa[5];
            pessoas[0] = new Pessoa() { ID=  1, Nome = "Teste 01" };
            pessoas[1] = new Pessoa() { ID=  2, Nome = "Teste 02" };
            pessoas[2] = new Pessoa() { ID=  3, Nome = "Teste 03" };
            pessoas[3] = new Pessoa() { ID=  4, Nome = "Teste 04" };
            pessoas[4] = new Pessoa() { ID=  5, Nome = "Teste 05" };
    
            pessoas[0].Conjugue = pessoas[1];
            pessoas[0].Filhos = new Pessoa[] { pessoas[2], pessoas[3], pessoas[4] };
    
            pessoas[1].Conjugue = pessoas[0];
            pessoas[1].Filhos = new Pessoa[] { pessoas[2], pessoas[3], pessoas[4] };
    
            pessoas[2].Pai = pessoas[0];
            pessoas[2].Mae = pessoas[1];
            pessoas[2].Irmaos = new Pessoa[] { pessoas[3], pessoas[4] };
    
            pessoas[3].Pai = pessoas[0];
            pessoas[3].Mae = pessoas[1];
            pessoas[3].Irmaos = new Pessoa[] { pessoas[2], pessoas[4] };
    
            pessoas[4].Pai = pessoas[0];
            pessoas[4].Mae = pessoas[1];
            pessoas[4].Irmaos = new Pessoa[] { pessoas[2], pessoas[3] };
    
            var json = JsonConvert.SerializeObject(pessoas, Formatting.Indented, new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                ReferenceLoopHandling = ReferenceLoopHandling.Serialize
            });
            Console.WriteLine(json);
            /*
            [  
              //pessoas[0]: "$ref": "1"
              {
                "ID": 1,
                "Nome": "Teste 01",
                "Conjugue": { "$ref": "2" },
                "Pai": null,
                "Mae": null,
                "Filhos": [{ "$ref": "3" }, { "$ref": "4" }, { "$ref": "5" } ],
                "Irmaos": null
              },
              //pessoas[1]: "$ref": "2"
              {
                "ID": 2,
                "Nome": "Teste 02",
                "Conjugue": { "$ref": "1" },
                "Pai": null,
                "Mae": null,
                "Filhos":  [{ "$ref": "3" }, { "$ref": "4" }, { "$ref": "5" } ],
                "Irmaos": null
              },
              //pessoas[2]: "$ref": "3"
              {
                "ID": 3,
                "Nome": "Teste 03",
                "Conjugue": null,
                "Pai": { "$ref": "1" },
                "Mae": { "$ref": "2" },
                "Filhos": null,
                "Irmaos": [{ "$ref": "4" }, { "$ref": "5" }]
              },
              //pessoas[3]: "$ref": "4"
              {
                "ID": 4,
                "Nome": "Teste 04",
                "Conjugue": null,
                "Pai": { "$ref": "1" },
                "Mae": { "$ref": "2" },
                "Filhos": null,
                "Irmaos": [{ "$ref": "3" }, { "$ref": "5" }]
              },
              //pessoas[4]: "$ref": "5"
              {
                "ID": 5,
                "Nome": "Teste 05",
                "Conjugue": null,
                "Pai": { "$ref": "1" },
                "Mae": { "$ref": "2" },
                "Filhos": null,
                "Irmaos": [{ "$ref": "3" }, { "$ref": "4" }]
              }
            ];
            */
        }
    }
    
        
    13.04.2016 / 04:20
    0

    Just get the first array structure:

    var armazenado = objTeste[0];
    

    And to use this structure:

    var id = armazenado.id;
    var nome = armazenado.nome;
    var id_pai = armazenado.pai.id;
    var nome_pai = armazenado.pai.nome;  
    
        
    13.04.2016 / 14:34