通过多维对象中的值搜索对象的属性

时间:2017-09-07 07:54:28

标签: javascript recursion

我需要找到包含id X的对象。

这就是我现在所做的,但我得到未定义

在递归中你可以得到你想要的东西,但当你试图从函数中取出值时,它总是给出相同的值 undefined

以下是我的例子:

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);

无需另外指定,提前谢谢。

1 个答案:

答案 0 :(得分:1)

您可以迭代对象的所有键,并检查值是否匹配或迭代实际对象。

此提案适用于任何嵌套数据结构。



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; }