【发布时间】:2021-08-16 18:06:02
【问题描述】:
我正在尝试比较两个对象,但仅使用三个键而不是所有键。它看起来像这样:
Object.keys(StateA)
.filter((k) => [k == 'name', 'x', 'y'])
.every((k) => StateA[k] == StateB[k])
)
我得到了错误的结果;我做错了什么?
【问题讨论】:
标签: javascript typescript object
我正在尝试比较两个对象,但仅使用三个键而不是所有键。它看起来像这样:
Object.keys(StateA)
.filter((k) => [k == 'name', 'x', 'y'])
.every((k) => StateA[k] == StateB[k])
)
我得到了错误的结果;我做错了什么?
【问题讨论】:
标签: javascript typescript object
如果您已经拥有/知道要比较的键,则无需过滤键;照原样使用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
}
}
【讨论】: