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í?
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))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:
uid , detenga la recursividad de sus propiedades)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));