比较TS中具有指定键的两个对象



我试图比较两个对象,但只有三个键而不是所有键。它看起来像这样:

Object.keys(StateA)
.filter((k) => [k == 'name', 'x', 'y'])
.every((k) => StateA[k] == StateB[k])
)

我得到错误的结果;我做错了什么?

如果事先已经有/知道要比较的键,则不需要过滤键;按原样使用every:

const A = { a: 0, b: 1, c: 2, x: 3, y: 4, z: 5 };
const B = { a: 0, b: 2, c: 3, x: 3, y: 4, z: 6 };
const match = ['a', 'x', 'y'].every(key => A[key] === B[key]);
console.log(match);

请记住,像这样一个简单的检查可能会给你假阳性-这取决于你想要什么。一种情况是一个键在一个对象中缺失,但在另一组undefined中出现。如果是这种情况,您可能还需要检查键是否存在:

const A = { a: 0, b: 1, c: undefined };
const B = { a: 0, b: 1 };
const keys = ['a', 'b', 'c'];
const match = keys.every(key => A[key] === B[key]);
console.log(match); // true
const stricterMatch = keys.every(key => (
key in A && key in B && A[key] === B[key]
));
console.log(stricterMatch); // false


export function hasSameProps (source: Record<string,unknown>, target: Record<string,unknown>) {
Object.keys(source).every(key => target.hasOwnProperty(key));

for (const key in ObjA) {
const current = ObjB[key];
if (!current) {
// does not exists
}
}

最新更新