objeto actual
const obj = { k1: v1, k2: v2, x1: v3, x2: v4, y: { z1: v5, z2: v6 } }objeto esperado
const obj = { k1: v2, k2: v1, x1: v4, x2: v3, y: { z1: v6, z2: v5 } }Probé el método de intercambio individual para cada tecla y también probé debajo de la forma de asignación de objetos
const obj = { k1: 'v1', k2: 'v2', x1: 'v3', x2: 'v4', y: { z1: 'v5', z2: 'v6' } } Object.assign(obj, { k1: obj.k2, k2: obj.k1, x1: obj.x2, x2: obj.x1, y: { z1: obj.y.z2, z2: obj.y.z1, } }); Object.keys(obj).forEach( (k) => obj[k] === null || (obj[k] === undefined && delete obj[k]) ); console.log(obj)en algunos casos, una vez que se ejecuta la asignación de objetos, aparecerá undefined para la tecla x1 o x2 porque v3 o v4 no son obligatorios. así que después de convertir tratando de eliminar las claves indefinidas del objeto
Esperando una solución optimizada y mejor para ello.
Su solución fue acceder a claves indefinidas de obj , como obj.k4 y obj.k3 , y también estaban asignando claves incorrectas k3 y k4 .
Su solución corregida
const obj = { k1: 'v1', k2: 'v2', x1: 'v3', x2: 'v4', y: { z1: 'v5', z2: 'v6' } }; Object.assign(obj, { k1: obj.k2, k2: obj.k1, x1: obj.x2, x2: obj.x1, y: { z1: obj.y.z2, z2: obj.y.z1, } }); console.log(obj);También puede hacer uso del operador de propagación para lograr lo mismo.
let obj = { k1: 'v1', k2: 'v2', x1: 'v3', x2: 'v4', y: { z1: 'v5', z2: 'v6' } }; obj = {...obj, ...{ k1: obj.k2, k2: obj.k1, x1: obj.x2, x2: obj.x1, y: { z1: obj.y.z2, z2: obj.y.z1, } }} console.log(obj);Puede escribir un método para eliminar lo indefinido:
const clean = o => JSON.parse(JSON.stringify(o)) const obj = { k1: 'v1', k2: 'v2', x1: 'v3', x2: 'v4', y: { z1: 'v5', z2: 'v6', }, } Object.assign(obj, { k1: obj.k2, k2: obj.k1, k3: obj.k4, k4: obj.k3, y: { z1: obj.v6, z2: obj.v5, }, }) console.log('obj:', obj) console.log('clean object:', clean(obj))