bypabloc_
bypabloc_

Reputation: 261

search for a property of an object by its value in a multidimensional object

I need to find the object that contains the id X.

It's what I've been up to now, but I get undefined.

Within the recursion you get what you want, but when you try to get the value out of the function, it always gives the same value undefined.

Here is an example of what I have:

let partes = [
  {
    "id": 317,
    "nombre": "Estación de Corte",
    "padre": 0,
    "conteo": 2,
    "partes": [
      {
        "id": 320,
        "nombre": "Ventosas",
        "padre": 317,
        "conteo": 3
      }
    ]
  },
  {
    "id": 1,
    "nombre": "Estación de Formación",
    "padre": 0,
    "conteo": 2,
    "partes": [
      {
        "id": 8,
        "nombre": "Placas",
        "padre": 1,
        "conteo": 1,
        "partes": [
          {
            "id": 305,
            "nombre": "Superior ",
            "padre": 8,
            "conteo": 2
          },
          {
            "id": 306,
            "nombre": "Inferior",
            "padre": 8,
            "conteo": 2
          }
        ]
      }
    ]
  },
  {
    "id": 4,
    "nombre": "Estación de Calentamiento",
    "padre": 0,
    "conteo": 1,
    "partes": [
      {
        "id": 7,
        "nombre": "Placas",
        "padre": 4,
        "conteo": 1,
        "partes": [
          {
            "id": 9,
            "nombre": "Placa Superior de Calentamiento",
            "padre": 7,
            "conteo": 1
          },
          {
            "id": 10,
            "nombre": "Placa Inferior de Calentamiento",
            "padre": 7,
            "conteo": 1
          }
        ]
      }
    ]
  },
  {
    "id": 341,
    "nombre": "Sistema de Descarte",
    "padre": 0,
    "conteo": 2,
    "partes": [
      {
        "id": 342,
        "nombre": "Dedos de Retension",
        "padre": 341,
        "conteo": 2
      }
    ]
  },
  {
    "id": 334,
    "nombre": "Sistema de Refrigeracion",
    "padre": 0,
    "conteo": 2,
    "partes": [
      {
        "id": 336,
        "nombre": "Evaporador",
        "padre": 334,
        "conteo": 1
      },
      {
        "id": 335,
        "nombre": "Compresor",
        "padre": 334,
        "conteo": 1
      },
      {
        "id": 338,
        "nombre": "Condensadora",
        "padre": 334,
        "conteo": 1
      },
      {
        "id": 337,
        "nombre": "Partes Electricas",
        "padre": 334,
        "conteo": 2
      }
    ]
  },
  {
    "id": 339,
    "nombre": "Sistema de Deteccion",
    "padre": 0,
    "conteo": 10,
    "partes": [
      {
        "id": 340,
        "nombre": "Camaras",
        "padre": 339,
        "conteo": 10
      }
    ]
  },
  {
    "id": 309,
    "nombre": "Estación de Sellado",
    "padre": 0,
    "conteo": 2,
    "partes": [
      {
        "id": 310,
        "nombre": "Placas",
        "padre": 309,
        "conteo": 5,
        "partes": [
          {
            "id": 311,
            "nombre": "Inferior",
            "padre": 310,
            "conteo": 5
          },
          {
            "id": 312,
            "nombre": "Superior",
            "padre": 310,
            "conteo": 5
          }
        ]
      },
      {
        "id": 315,
        "nombre": "Leva",
        "padre": 309,
        "conteo": 1
      },
      {
        "id": 314,
        "nombre": "Muelles",
        "padre": 309,
        "conteo": 2
      },
      {
        "id": 313,
        "nombre": "Esparragos",
        "padre": 309,
        "conteo": 1
      },
      {
        "id": 316,
        "nombre": "Resortes",
        "padre": 309,
        "conteo": 1
      }
    ]
  }
];

function get_array(array, id) {
  for (n in array) {
    if(id === array[n].id){
  		return array[n].partes;
    	break;
    }else if (array[n].partes) {
      get_array(array[n].partes, id);
    }
  }
}

let graphic_array = (get_array(partes, 310));
console.log(graphic_array);

Nothing more to specify, thank you in advance.

Upvotes: 1

Views: 27

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386858

You could iterate all keys of the objects and check if a value matches or iterate actual objects.

This proposal works for any nested data structures.

function getObject(object, value) {
    var result;
    return Object.keys(object).some(function (k) {
        if (object[k] === value) {
            result = object;
            return true;
        }
        if (object[k] && typeof object[k] === 'object' && (result = getObject(object[k], value))) {
            return true;
        }
    }) && result || undefined;
}

var data = [{ id: 317, nombre: "Estación de Corte", padre: 0, conteo: 2, partes: [{ id: 320, nombre: "Ventosas", padre: 317, conteo: 3 }] }, { id: 1, nombre: "Estación de Formación", padre: 0, conteo: 2, partes: [{ id: 8, nombre: "Placas", padre: 1, conteo: 1, partes: [{ id: 305, nombre: "Superior ", padre: 8, conteo: 2 }, { id: 306, nombre: "Inferior", padre: 8, conteo: 2 }] }] }, { id: 4, nombre: "Estación de Calentamiento", padre: 0, conteo: 1, partes: [{ id: 7, nombre: "Placas", padre: 4, conteo: 1, partes: [{ id: 9, nombre: "Placa Superior de Calentamiento", padre: 7, conteo: 1 }, { id: 10, nombre: "Placa Inferior de Calentamiento", padre: 7, conteo: 1 }] }] }, { id: 341, nombre: "Sistema de Descarte", padre: 0, conteo: 2, partes: [{ id: 342, nombre: "Dedos de Retension", padre: 341, conteo: 2 }] }, { id: 334, nombre: "Sistema de Refrigeracion", padre: 0, conteo: 2, partes: [{ id: 336, nombre: "Evaporador", padre: 334, conteo: 1 }, { id: 335, nombre: "Compresor", padre: 334, conteo: 1 }, { id: 338, nombre: "Condensadora", padre: 334, conteo: 1 }, { id: 337, nombre: "Partes Electricas", padre: 334, conteo: 2 }] }, { id: 339, nombre: "Sistema de Deteccion", padre: 0, conteo: 10, partes: [{ id: 340, nombre: "Camaras", padre: 339, conteo: 10 }] }, { id: 309, nombre: "Estación de Sellado", padre: 0, conteo: 2, partes: [{ id: 310, nombre: "Placas", padre: 309, conteo: 5, partes: [{ id: 311, nombre: "Inferior", padre: 310, conteo: 5 }, { id: 312, nombre: "Superior", padre: 310, conteo: 5 }] }, { id: 315, nombre: "Leva", padre: 309, conteo: 1 }, { id: 314, nombre: "Muelles", padre: 309, conteo: 2 }, { id: 313, nombre: "Esparragos", padre: 309, conteo: 1 }, { id: 316, nombre: "Resortes", padre: 309, conteo: 1 }] }];

console.log(getObject(data, 310));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 1

Related Questions