首页 > 解决方案 > 在 TS 中比较两个具有指定键的对象

问题描述

我正在尝试比较两个对象,但仅使用三个键而不是所有键。它看起来像这样:

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

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

标签: javascripttypescriptobject

解决方案


如果您事先已经拥有/知道要比较的密钥,则无需过滤密钥;照原样使用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


推荐阅读