Organize object in Javascript

Asked

Viewed 141 times

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 son who brings his relatives into it,.

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 ignoring the rest of the objTeste. I am using Javascript to organize this object.

Can someone help me?

  • 1

    What do you mean "store in another object"? To isolate that object you can use objTeste[0].

  • That the new object receives only the objTeste[0] more has to check if he has kin, because this object may be the father of another in the future then I have to organize it again, bringing only the son and his relatives.

  • I still don’t quite understand your doubt, the way you store it is no longer saving the parents inside the children?

  • Explain better the idea you have of relatives and children to be clearer. Without it seems to me that this is enough: var novoObjeto = objTeste[0];

  • I want to ignore the relatives objects outside the child, bringing them in the child object. I have to make this organization using a for??

3 answers

2

If I understand correctly, you don’t want elements that already appear as the parent of another element to be present as elements in the main vector, avoiding repeating elements.

If that’s right, you can do it in two steps:

  1. Go through all the elements and store which ones are parents of other elements
  2. Eliminate from the vector those who are parents, 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 functional example in Jsfiddle.

  • Thank you! That’s exactly what I’ve been wanting to do.

0

this may not be your case, but maybe you can use the cycle.js, with it you can point to an object reference, and not object in yes.

This blibioteca can also be useful if you want to make a JSON.stringify in a circular referenced 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>

some server-side blibiotecas, such as the Newtonsoft.Json for C# use a similar approach to solve circular reference problems, but in this case the $ref does not point to the Path of the object, but to the object with the property $id of the same value.

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

in this case the received 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" }]
          }
        ];
        */
    }
}

0

Just take the first structure of the array:

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;  

Browser other questions tagged

You are not signed in. Login or sign up in order to post.