是否可以仅在两个对象共享的键/属性之间比较它们?

问题描述 投票:0回答:3

所以我有两个对象

address: {
  id: 1234,
  city: "foo",
  country: "bar",
  name: "baz"
}

defaultAddress: { 
  id: 1234,
  city: "foo",
  country: "bar",
  firstName: "ba",
  lastName: "z"
}

如果我尝试在它们之间进行直接比较/断言,即

expect(address).to.contain(defaultAddress)

(或相反),它会失败,因为每个包含另一个不包含的字段

(断言错误:期望 {address} 有一个属性“firstName”)

我只想比较它们共享的键中的值。是否可以通过编程方式执行类似的操作?

javascript json chai
3个回答
2
投票

您正在尝试匹配共享密钥子集中的对象。这可以按如下方式完成。

for(const key in address) {
  if(typeof defaultAddress[key] !== 'undefined') {
    expect(address[key]).to.equal(defaultAddress[key])
  }
}

也看看这个答案


1
投票

为什么不使用

.to.include.any.keys
作为

expect(defaultAddress).to.include.any.keys(...Object.keys(address));

虽然没有测试过


0
投票

我想强调一个尚未提及的重要方面。

虽然总是可以编写函数

f(a, b) {...}

测试两个对象

a
b
是否在公共键对应中共享相同的值,应该明确指出这样的函数不能被视为等价的定义,因为每个等价都要求是传递的。

assert(f({a: 0}, {a: 0, b: 1}))  
assert(f({a: 0, b: 1}, {b: 1}))  
assert(!f({a: 0}, {b: 1}))
© www.soinside.com 2019 - 2024. All rights reserved.