Tengo una pregunta compleja para la que no puedo encontrar la respuesta. Entonces, en mi bot de Discord, tengo un pequeño objeto llamado config . También tengo un objeto baseConfig , que son los valores predeterminados que se usan cuando el bot se agrega a un nuevo servidor. A veces, actualizo mi bot de una manera que requiere un nuevo valor de configuración: quiero poder agregarlo a baseConfig y que la nueva clave se refleje en la config . (En realidad, el objeto de configuración tiene objetos anidados para diferentes gremios, pero lo escribo de una manera en la que esto es irrelevante). Como ejemplo, digamos que obj1 es una configuración y obj2 es la configuración base.
let obj1 = { emojiSettings: { success: ":success:", error: ":error:" }, warnSettings: { muteThreshold: 3, expireHours: 48 } } Digamos que actualizo obj2 con una nueva configuración:
// defaults let obj2 = { emojiSettings: { success: ":defaultSuccess:" error: ":defaultError:" } warnSettings: { muteThreshold: 2, expireHours: 24 } newConfig: { newOption: 4 } } Quiero que todas las configuraciones en obj1 permanezcan igual, pero agregue los objetos y las claves que se actualizaron en obj2 .
Escribiría una función para comparar profundamente las dos que itera sobre cada propiedad. Si la propiedad no existe en obj1, la agrega. Si la propiedad existe en obj1, verifica si esa propiedad es un objeto (pero no una matriz) y, si lo es, la función recursivamente se llama a sí misma para asegurarse de que todas las propiedades de ese objeto también existan en obj1.
const updateObject = (o1, o2) => { Object.entries(o2).forEach((prop) => { const propName = prop[0]; if (!o1[propName]) { if (typeof o2[propName] !== 'object' || Array.isArray(o2[propName])) { o1[propName] = o2[propName]; } else { o1[propName] = { ...o2[propName] }; } } else if (typeof o2[propName] === 'object' && !Array.isArray(o2[propName])) { updateObject(o1[propName], o2[propName]); } }); }; updateObject(obj1, obj2);