JavaScript: ¿devolver diferencias entre dos objetos?
object (5)
Puede usar Object.keys() y Array.includes() para hacer eso.
var data = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}",
"83": "{/"sid/":/"83/",/"name/":/"The blahblah derp/"}",
"87": "{/"sid/":/"87/",/"name/":/"The derpy title 4/"}"
};
var obj1 = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}"
};
var result = {};
var keys = Object.keys(obj1);
for (var key in data) {
if (!keys.includes(key)) {
result[key] = data[key];
}
}
console.log(result);
¿Alguien puede mostrarme cómo devolver los datos nuevos al comparar algo como esto? usando JavaScript vainilla.
{
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}"
}
comparado con esto
{
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}",
"83": "{/"sid/":/"83/",/"name/":/"The blahblah derp/"}",
"87": "{/"sid/":/"87/",/"name/":/"The derpy title 4/"}"
}
debería devolver solo las diferencias.
{
"83": "{/"sid/":/"83/",/"name/":/"The blahblah derp/"}",
"87": "{/"sid/":/"87/",/"name/":/"The derpy title 4/"}"
}
Puede usar
Object.prototype.entries
y
Array.prototype.reduce
.
const a = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}"
};
const b = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}",
"83": "{/"sid/":/"83/",/"name/":/"The blahblah derp/"}",
"87": "{/"sid/":/"87/",/"name/":/"The derpy title 4/"}"
};
const c = Object.entries(b).reduce((c, [k, v]) => Object.assign(c, a[k] ? {} : { [k]: v }), {});
console.log(c);
Puede usar un procedimiento en el que no importa el orden de los objetos a comparar
Código:
const obj1 = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}"
}
const obj2 = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}",
"83": "{/"sid/":/"83/",/"name/":/"The blahblah derp/"}",
"87": "{/"sid/":/"87/",/"name/":/"The derpy title 4/"}"
}
const getDiffObj = (o1, o2) => Object.keys(o1)
.filter(k => !Object.keys(o2).includes(k))
.concat(Object.keys(o2).filter(k => !Object.keys(o1).includes(k)))
.map(k => o1[k] || o2[k])
console.log(getDiffObj(obj1, obj2))
console.log(getDiffObj(obj2, obj1))
Simplemente puede iterar el segundo objeto y verificar si esta clave existe en el primer objeto. De lo contrario, en un nuevo objeto, agregue esta clave y su valor.
let data1 = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}"
}
let data2 = {
"48": "{/"sid/":/"48/",/"name/":/"title 1/"}",
"77": "{/"sid/":/"77/",/"name/":/"The blahblah title/"}",
"83": "{/"sid/":/"83/",/"name/":/"The blahblah derp/"}",
"87": "{/"sid/":/"87/",/"name/":/"The derpy title 4/"}"
}
let newObj = {};
for (let keys in data2) {
if (!data1[keys]) {
newObj[keys] = data2[keys]
}
};
console.log(newObj)
Un enfoque orientado a objetos usando
reduce
.
const obj1 = {
''48'': ''{"sid":"48","name":"title 1"}'',
''77'': ''{"sid":"77","name":"The blahblah title"}'',
}
const obj2 = {
''48'': ''{"sid":"48","name":"title 1"}'',
''77'': ''{"sid":"77","name":"The blahblah title"}'',
''83'': ''{"sid":"83","name":"The blahblah derp"}'',
''87'': ''{"sid":"87","name":"The derpy title 4"}'',
}
const combinedObject = { ...obj1, ...obj2 }
const diff = Object.entries(combinedObject).reduce((acc, [key, value]) => {
if (
!Object.values(obj1).includes(value) ||
!Object.values(obj2).includes(value)
)
acc[key] = value
return acc
}, {})
console.log(diff)
Este enfoque funcionará con varios objetos y no trata un objeto como el principal para la comparación.