javascript 使用Chai查看两个对象是否相同,其中一个属性具有不同的顺序

relj7zay  于 2023-11-15  发布在  Java
关注(0)|答案(3)|浏览(97)

我有两个对象数组:

array1 = [ 
  { name: 'Kitty, Hello',
    otherNames: [ '(1) One', '(2) Two' ] 
  },
  { name: 'Cat, Garfield',
    otherNames: [ '(3) Three' ] 
  } 
];

array2 = [ 
  { name: 'Kitty, Hello',
    otherNames: [ '(2) Two', '(1) One' ] 
  },
  { name: 'Cat, Garfield', 
    otherNames: [ '(3) Three' ] 
   } 
]

字符串
我试图使用Chai来查看它们是否相等,尽管otherNamesarray1和`array2中的顺序不同。
我试过:

array1.to.be.eql(array2) //false
array1.to.have.deep.members(array2) //false


但是它总是返回false。这可能吗?我试过看类似的问题,但是我只能找到“name”和“otherNames”顺序不同的问题。

4bbkushb

4bbkushb1#

它们不相等,因为它们在数组中有不同的值。你可以对数组进行排序,然后检查它们是否相等。

const getSortedAtKey = (array, key = 'otherNames') => {
  return array.map(value => ({
    ...value,
    [key]: value[key].sort()
  }));
}

expect(getSortedAtKey(array1)).to.eql(getSortedAtKey(array2))

字符串
这个函数很好,因为您可以将它链接到多个属性(例如,如果您想要验证otherNamesotherAges数组,则可以调用getSortedAtKey(getSortedAtKey(array1), 'otherAges')

nfs0ujit

nfs0ujit2#

有一个软件包。https://www.npmjs.com/package/deep-equal-in-any-order

const deepEqualInAnyOrder = require('deep-equal-in-any-order');
const chai = require('chai');

chai.use(deepEqualInAnyOrder);

const { expect } = chai;

expect(array1).to.deep.equalInAnyOrder(array2);

字符串

nx7onnlm

nx7onnlm3#

如果最初的帖子是最近的,我会建议@webdesignnoob重新考虑他的设计。广义上说,这个问题涉及到对象之间的等价概念。
在@ut8pia/classifier库中,等价可以通过表示函数来实现:

const 
  objRepr = obj => [obj.name, ...obj.otherNames.sort()],
  arrayRepr = array => array.map(objRepr).flat().join(', '),
  
  equal = TrueSet.of(arrayRepr, ORDER.ASCENDING, ORDER.SINGULAR)
    .let(array1)
      .has(array2)

字符串
该库声称解决了JavaScript中对排序集合的长期需求。有关详细解释,请参阅online documentation

相关问题