🔥
[TypeScript]2つのオブジェクトの差分を取得
type GenericObject = { [key: string]: any };
const obj1: GenericObject = {
a: "a1",
b: "b1",
};
const obj2: GenericObject = {
a: "a1",
b: "b2",
c: "c1",
};
// beforeとafterの差分を取得
const getDiff = (
before: GenericObject,
after: GenericObject,
): GenericObject => {
const allKeys = new Set([...Object.keys(before), ...Object.keys(after)]);
return Array.from(allKeys).reduce<GenericObject>((diff, key) => {
if (before[key] !== after[key]) {
diff[key] = key in after ? after[key] : before[key];
}
return diff;
}, {});
};
console.log(getDiff(obj1, obj2)); //{ "b": "b2", "c": "c1" }
console.log(getDiff(obj1, obj1)); // {}
console.log(getDiff(obj2, obj1)); // { "b": "b1", "c": "c1" }
// beforeに存在するキーの中でbeforeと異なるafterのプロパティを取得する
const getDiffInAfterForBeforeKeys = (
before: GenericObject,
after: GenericObject,
): GenericObject => {
return Object.fromEntries(
Object.entries(after).filter(([key, value]) =>
key in before && before[key] !== value),
);
};
console.log(getDiffInAfterForBeforeKeys(obj1, obj2)); //{ "b": "b2"}
console.log(getDiffInAfterForBeforeKeys(obj1, obj1)); // {}
console.log(getDiffInAfterForBeforeKeys(obj2, obj1)); // { "b": "b1"}
Discussion
便利そうと思い、Deepでもいけるか、ぼくも挑戦してみました。
定義側
使用側
demo code.