Tengo una función que toma dos objetos como parámetros y luego compara esos dos objetos, recursivamente, para producir un nuevo objeto. Ahora estoy configurando algunas pruebas para esta función. Si quiero agregar un nodo a la raíz de uno de los objetos, sobre la marcha, de manera sucinta, puedo hacer esto:
diff(oldObj, {...newObj, testRootProp: 'testValue'});Mi pregunta es, ¿hay alguna forma sucinta de agregar un nodo al objeto cuando el nodo al que quiero agregar no está en la raíz?
Por ejemplo, digamos que quiero tomar este objeto:
{ id: 1, name: "John" associates: [ {name: "Samantha"}, {name: "Jonah"}, ] }Y producir esto:
{ id: 1, name: "John" associates: [ {name: "Samantha"}, {name: "Jonah", member: false}, // this has changed ] } ¿Hay alguna manera sucinta de que pueda hacerlo con mi función diff(oldObj, newObj) , haciendo este cambio sobre la marcha por lo que paso, en lugar de tener que pasar todo el objeto nuevo como segundo parámetro?
Puede agregar un parámetro a diff, que especificaría en qué lugar del objeto de destino colocar el valor adicional.
const location = { name: 'Arbys', hours: { monday: {open: '8:00 AM', close: '10:00 PM'}, tuesday: {open: '8:00 AM', close: '10:00 PM'}, wednesday: {open: '8:00 AM', close: '10:00 PM'}, thursday: {open: '8:00 AM', close: '10:00 PM'}, friday: {open: '8:00 AM', close: '10:00 PM'}, saturday: {open: '8:00 AM', close: '10:00 PM'}, }, }; const newLocation = diff( location, { open: "10:00 AM", close: "9:00 PM" }, { path: 'hours.sunday' } ); // newLocation // { // name: 'Arbys', // hours: { // monday: {open: '8:00 AM', close: '10:00 PM'}, // tuesday: {open: '8:00 AM', close: '10:00 PM'}, // wednesday: {open: '8:00 AM', close: '10:00 PM'}, // thursday: {open: '8:00 AM', close: '10:00 PM'}, // friday: {open: '8:00 AM', close: '10:00 PM'}, // saturday: {open: '8:00 AM', close: '10:00 PM'}, // sunday: { open: "10:00 AM", close: "9:00 PM" }, // }, // }Su ejemplo es engañoso porque necesita cambiar algo dentro de una matriz.
const person = { id: 1, name: "John", associates: [ {name: "Samantha"}, {name: "Jonah"}, ], }; const newPerson = diff( person, false, { path: '[associates].member', finders: [ (node) => node['name'] === 'Jonah', ], } ); El tercer parámetro especifica cómo colocar los nuevos valores false . Dice:
associates .finders para encontrar los objetos a los que queremos agregar.member a los objetos encontrados con el valor false .De esta forma, puede especificar cualquier lugar en el objeto de destino para colocar el nuevo valor.
const college = { students: [ /* ... */ ], // ... }; const mutatedCollege = diff( college, { name: 'Randy', id: '12345' }, { path: '[students].[courses].professor', finders: [ (student) => student.isFullTime, (course) => course.hours > 3, ], }, );Por supuesto, la persona que llama aún puede omitir el tercer parámetro y simplemente fusionar los objetos:
const a = {foo: 'x'); const b = {bar: 'y'); const c = diff(a, b); // c // { // foo: 'x', // bar: 'y', // }