Chai - 检查 2 objects 个数组是否具有相同的标题

Chai - check 2 objects arrays have same title

假设我有 2 个包含 objects:

的数组
var aArray = [ { title: 'Abc', price: '1,200' }, { title: 'def', price: '900' } ]

var bArray = [ { title: 'def', price: '900', other: 'someDetail' }, { title: 'Abc', price: '1,200', other: 'someDetail' } ]

我如何验证它们在每个数组中具有相同的标题值,即使它们的顺序不同?

我可以使用类似的东西吗:

expect(aArray.title).to.deep.equal(bArray.title)

然后对于那个匹配的标题项目,我想检查两者之间的价格是否相同。

我也试过了 expect(cart).to.deep.include.members(cart2).but.not.own.deep.include.property('someDetail');

您可以在数组上使用 find() 方法。

The find() method returns the value of the first element in the array that satisfies the provided testing function. Otherwise undefined is returned.

var aArray = [ { title: 'Abc', price: '1,200' }, { title: 'def', price: '900' } ]

var bArray = [ { title: 'def', price: '900' }, { title: 'Abc', price: '1,200' } ]

var sameTitle = true;
aArray.forEach(function(objA){
    var titleMatch = bArray.find(function(objB){
        return objA.title === objB.title;
    })
    if(titleMatch === undefined) sameTitle = false;
})
console.log(sameTitle);

你用这种方式验证。

 var aArray = [ { title: 'Abc', price: '1,200' }, { title: 'def', price: '900' } ]

    var bArray = [ { title: 'def', price: '900' }, { title: 'Abc', price: '1,200' } ]


    for(i=0;i<aArray.length;i++){
        var CheckTitle=aArray[i].title;
        for(j=0;j<bArray.length;j++){
            var CheckTitle1=bArray[j].title;

            if(CheckTitle==CheckTitle1){
                alert("same title");
            }
            else{
                alert("diff title");
            }

        }
    }

我想你可以从这两个数组中得到所有的标题。

并使用eql来比较它们。

var aArray = [ { title: 'Abc', price: '1,200' }, { title: 'def', price: '900' } ]
var bArray = [ { title: 'def', price: '900', other: 'someDetail' }, { title: 'Abc', price: '1,200', other: 'someDetail' } ]

var aTitle = aArray.map(item => item.title);
var bTitle = bArray.map(item => item.title);

expect(aTitle).eql(bTitle)

更新

如果要检查titleprice是否匹配,目前我想到一种方法会更简单。

您可以将标题和价格连接成一个字符串并进行比较。

var aArray = [ { title: 'Abc', price: '1,200' }, { title: 'def', price: '900' } ]
var bArray = [ { title: 'def', price: '900', other: 'someDetail' }, { title: 'Abc', price: '1,200', other: 'someDetail' } ]

var aTitle = aArray.map(item => `${item.title}|${item.price}`); // ['Abc|1,200', 'def|900']
var bTitle = bArray.map(item => `${item.title}|${item.price}`);
expect(aTitle).eql(bTitle);

我想有多种方法可以做到这一点。这是一种只需要您将 bArray 映射到具有您需要的键的对象的方法,即 titleprice.

那你就可以使用members along with deep了。如您所见,不需要数组成员的相同顺序,但需要相同的键。

const aArray = [ { title: 'Abc', price: '1,200' }, { title: 'def', price: '900' } ]

const bArray = [ { title: 'def', price: '900', other: 'someDetail' }, { title: 'Abc', price: '1,200', other: 'someDetail' } ]

const newBArray = bArray.map(({ title, price }) => ({ title, price }))

try {
  chai.expect(newBArray).to.have.deep.members(aArray)
} catch (e) {
  console.log("Error!", e)
} finally {
  console.log("Done with execution.")
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/4.1.2/chai.min.js"></script>

我已使用 try/catch/finally 让代码给出有关正在发生的事情的有效提示。