i我想比较两个几乎总是具有相同属性的对象,并根据其值与第一个对象不同的属性创建一个新对象。在下面的示例中,我想检查inputData是否具有与currentData不同的key:values。然后根据这些键和值创建一个新对象。希望有道理吗?我应该采取什么方法?一些递归的Oject.assign?传播操作?循环?
const currentData = {
title: 'John',
email: '[email protected]'
address {
street: 'myStreet 13'
}
}
const inputData = {
title: 'Tom',
email: '[email protected]',
address {
street: 'yourStreet 17'
}
}
结果应该是这样的:
const result = {
title: 'Tom',
address: {
street: 'yourStreet 17'
}
}
您将需要一个递归函数,循环遍历对象,类似以下几行:
function compareObjects(a, b) {
// Assume they'll be the same
let result = null;
// Keep track of the keys we've seen
let keys = new Set();
for (const key in a) {
keys.add(key);
if (!(key in b)) {
// You'll want to decide what to do here, use `undefined`?
} else {
const avalue = a[key];
const bvalue = b[key];
if (avalue !== bvalue) {
const aIsObject = typeof avalue === "object";
const bIsObject = typeof bvalue === "object";
if (aIsObject && bIsObject) {
// Both are objects, recurse
const update = compareObjects(avalue, bvalue);
if (update) {
result = result || {};
result[key] = update;
}
} else {
// Different values
result = result || {};
result[key] = bvalue;
}
}
}
}
// Add in any that are in `b` but weren't in `a`
for (const key in b) {
if (!keys.has(key)) {
result = result || {};
result[key] = b[key];
}
}
return result;
}
实时示例:
const currentData = {
title: 'John',
email: '[email protected]',
address: {
street: 'myStreet 13'
}
};
const inputData = {
title: 'Tom',
email: '[email protected]',
address: {
street: 'yourStreet 17'
}
};
function compareObjects(a, b) {
// Assume they'll be the same
let result = null;
// Keep track of the keys we've seen
let keys = new Set();
for (const key in a) {
keys.add(key);
if (!(key in b)) {
// You'll want to decide what to do here, use `undefined`?
} else {
const avalue = a[key];
const bvalue = b[key];
if (avalue !== bvalue) {
const aIsObject = typeof avalue === "object";
const bIsObject = typeof bvalue === "object";
if (aIsObject && bIsObject) {
// Both are objects, recurse
const update = compareObjects(avalue, bvalue);
if (update) {
result = result || {};
result[key] = update;
}
} else {
// Different values
result = result || {};
result[key] = bvalue;
}
}
}
}
// Add in any that are in `b` but weren't in `a`
for (const key in b) {
if (!keys.has(key)) {
result = result || {};
result[key] = b[key];
}
}
return result;
}
console.log(compareObjects(currentData, inputData));