Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

200
Vistas
JS: agregue una matriz de objetos con datos de otro

Tengo algunos datos JS que contienen todo tipo de datos, números, objetos secundarios, matrices, etc. en todo tipo de estructuras diferentes:

 let datapile = { cover_img: { uid:'u2a3j4' }, avatar_img: { uid:'u5j3vg' }, created: 8273736384, friends: [ { name:'John', img: { uid:'u2726b' }, }, { name:'Jane', parent: { profile_img: { uid:'u293k4' }, } }, ], occupation: { past: current, prior: { title: 'Accountant', company: { logo: { img: { uid:'u29374' } }, } }, }, ... }

Y luego tengo esta lista JS de imágenes:

 let imgs : [ { uid:'u2a3j4', format:'jpg', alt_txt:'Lorem...', size:583729, dominant_color:'#d79273' }, { uid:'u5j3vg', format:'png', alt_txt:'Lorem...', size:284849, dominant_color:'#f99383' }, { uid:'u2726b', format:'gif', alt_txt:'Lorem...', size:293742, dominant_color:'#349a83' }, ... ],

Ahora, lo que necesito es una función a la que pueda llamar que busque en la pila de datos y agregue objetos de datos img de la lista de imgs a continuación. Entonces, donde la pila de datos ahora tiene solo la referencia uid, debería tener el objeto img completo. Y luego haré lo mismo con todo tipo de otros datos referenciados.

He probado la siguiente función:

 function isArray(x){ return ( x !== undefined && Array.isArray(x) ) } function isObject(x){ return (x && typeof x === "object" && !Array.isArray(x)) } function get_item(type, uid) { /* loops through eg. imgs and returns img matching uid */ } function append_referenced_relations(data){ if( !data ) return data if( isObject(data) && data['uid'] !== undefined ) { let item = get_item('any', data['uid']) data = item } if( isObject(data) || isArray(data) ) { for( let key in data ) { data[key] = this.append_referenced_relations(deepClone(data[key])) } } return data }

... pero simplemente no puedo hacer que funcione. Y mis mejores esfuerzos de búsqueda en Google para escenarios similares también han resultado vacíos. ¿Puede Internet ayudarme aquí?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

puedes intentar algo como esto

básicamente usa recursividad y Object.fromEntries /entries para verificar todas las claves del objeto interno

si tienes alguna pregunta especifica no dudes en preguntarme

 const decorate = (obj, data) => { if (typeof obj !== 'object') { return obj } if (Array.isArray(obj)) { return obj.map(e => decorate(e, data)) } return Object.fromEntries( Object.entries(obj).flatMap(([k, v]) => { if (k === 'uid') { const imgData = data.find(d => v === d.uid) return Object.entries(imgData || [[k, v]]) } return [ [k, decorate(v, data)] ] }) ) } let datapile = { cover_img: { uid: 'u2a3j4' }, avatar_img: { uid: 'u5j3vg' }, created: 8273736384, friends: [{ name: 'John', img: { uid: 'u2726b' }, }, { name: 'Jane', parent: { profile_img: { uid: 'u293k4' }, } }, ], occupation: { past: 'current', prior: { title: 'Accountant', company: { logo: { img: { uid: 'u29374' } } } } } } let imgs = [{ uid: 'u2a3j4', format: 'jpg', alt_txt: 'Lorem...', size: 583729, dominant_color: '#d79273' }, { uid: 'u5j3vg', format: 'png', alt_txt: 'Lorem...', size: 284849, dominant_color: '#f99383' }, { uid: 'u2726b', format: 'gif', alt_txt: 'Lorem...', size: 293742, dominant_color: '#349a83' } ] console.log(decorate(datapile, imgs))

about 4 years ago · Juan Pablo Isaza Denunciar

0

Debe recurrir a la pila de datapile para identificar el objeto con uid y agregar las propiedades img que se agregarán.

Algunos casos a considerar:

  1. Objetos. (Si el objeto tiene la propiedad uid , detenga la recursividad de sus propiedades)
  2. Valores de objeto que tienen objetos.
  3. Matriz de objetos.

En realidad, no es necesario regresar a ninguna parte de su función, ya que podemos actualizar los objetos en línea.

Prueba como a continuación.

 let imgs = [ { uid: "u2a3j4", format: "jpg", alt_txt: "Lorem...", size: 583729, dominant_color: "#d79273", }, { uid: "u5j3vg", format: "png", alt_txt: "Lorem...", size: 284849, dominant_color: "#f99383", }, { uid: "u2726b", format: "gif", alt_txt: "Lorem...", size: 293742, dominant_color: "#349a83", }, { uid: "u293k4", format: "gif", alt_txt: "Lorem...", size: 193742, dominant_color: "#349a83", }, { uid: "u29374", format: "gif", alt_txt: "Lorem...", size: 793742, dominant_color: "#349a83", }, ]; let datapile = { cover_img: { uid: "u2a3j4" }, avatar_img: { uid: "u5j3vg" }, created: 8273736384, friends: [ { name: "John", img: { uid: "u2726b" } }, { name: "Jane", parent: { profile_img: { uid: "u293k4" } } }, ], occupation: { past: "current", prior: { title: "Accountant", company: { logo: { img: { uid: "u29374" } }, }, }, }, }; function isArray(x) { return x !== undefined && Array.isArray(x); } function isObject(x) { return typeof x === "object" && !Array.isArray(x); } function get_item(uid) { return imgs.find((img) => img.uid === uid); } function append_referenced_relations(data) { if (isObject(data)) { if (data["uid"] !== undefined) { const img = get_item(data.uid); // Add img properties to the same object as properties Object.entries(img).forEach(([key, value]) => { data[key] = value; }); } else { // Recurse for the object values Object.values(data).forEach((item) => { append_referenced_relations(item); }); } } else if (isArray(data)) { data.forEach((item) => { // Recurse for the array entries append_referenced_relations(item); }); } } append_referenced_relations(datapile); console.log(JSON.stringify(datapile, null, 2));

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda