Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

221
Views
use jQuery's find () en el objeto JSON

Similar a la pregunta de brnwdrng , estoy buscando una manera de buscar a través de un objeto similar a JSON.
suponiendo que la estructura de mi objeto es así:

 TestObj = { "Categories": [{ "Products": [{ "id": "a01", "name": "Pine", "description": "Short description of pine." }, { "id": "a02", "name": "Birch", "description": "Short description of birch." }, { "id": "a03", "name": "Poplar", "description": "Short description of poplar." }], "id": "A", "title": "Cheap", "description": "Short description of category A." }, { "Product": [{ "id": "b01", "name": "Maple", "description": "Short description of maple." }, { "id": "b02", "name": "Oak", "description": "Short description of oak." }, { "id": "b03", "name": "Bamboo", "description": "Short description of bamboo." }], "id": "B", "title": "Moderate", "description": "Short description of category B." }] };

Me gustaría obtener un objeto con id="A".

He probado todo tipo de cosas como:

 $(TestObj.find(":id='A'"))

Pero nada parece funcionar.

¿Alguien puede pensar en una forma de recuperar un elemento en función de algunos criterios sin usar 'cada'?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

jQuery no funciona en literales de objetos simples. Puede usar la siguiente función de manera similar para buscar todos los 'id' (o cualquier otra propiedad), independientemente de su profundidad en el objeto:

 function getObjects(obj, key, val) { var objects = []; for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (typeof obj[i] == 'object') { objects = objects.concat(getObjects(obj[i], key, val)); } else if (i == key && obj[key] == val) { objects.push(obj); } } return objects; }

Usar así:

 getObjects(TestObj, 'id', 'A'); // Returns an array of matching objects
over 4 years ago · Santiago Trujillo Report

0

La solución de javascript puro es mejor, pero una forma de jQuery sería usar los métodos jQuery grep y/o map . Probablemente no sea mucho mejor que usar $.each

 jQuery.grep(TestObj, function(obj) { return obj.id === "A"; });

o

 jQuery.map(TestObj, function(obj) { if(obj.id === "A") return obj; // or return obj.name, whatever. });

Devuelve una matriz de los objetos coincidentes o de los valores buscados en el caso de map. Podría ser capaz de hacer lo que quieras simplemente usándolos.

Pero en este ejemplo tendría que hacer algo de recursividad, porque los datos no son una matriz plana y estamos aceptando estructuras, claves y valores arbitrarios, tal como lo hacen las soluciones de JavaScript puro.

 function getObjects(obj, key, val) { var retv = []; if(jQuery.isPlainObject(obj)) { if(obj[key] === val) // may want to add obj.hasOwnProperty(key) here. retv.push(obj); var objects = jQuery.grep(obj, function(elem) { return (jQuery.isArray(elem) || jQuery.isPlainObject(elem)); }); retv.concat(jQuery.map(objects, function(elem){ return getObjects(elem, key, val); })); } return retv; }

Esencialmente lo mismo que la respuesta de Box9, pero usando las funciones de la utilidad jQuery donde sea útil.

········

over 4 years ago · Santiago Trujillo Report

0

Esto me funciona en [{"id":"data"},{"id":"data"}]

 function getObjects(obj, key, val) { var newObj = false; $.each(obj, function() { var testObject = this; $.each(testObject, function(k,v) { //alert(k); if(val == v && k == key) { newObj = testObject; } }); }); return newObj; }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!