Angular TypeScript中嵌套数组比较始终返回false求助
嵌套数组内容相等校验失败的排查与解决
问题根源
数组属于引用类型,用==或===比较时,实际对比的是两个数组在内存中的引用地址,而非数组的内容。哪怕两个数组的元素完全一致,只要是不同的数组实例,结果都会返回false,这就是你代码始终返回false的核心原因。
解决方法
1. 自定义辅助函数,逐元素校验(推荐,灵活可控)
先写一个用于比较saleLineList内容的辅助函数,可根据实际数据结构调整对比逻辑:
// 比较两个saleLineList是否内容相等 function areLineListsEqual(listA, listB) { // 长度不同直接判定不等 if (listA.length !== listB.length) return false; // 遍历每个元素,这里假设saleLine是普通对象,可按需修改对比规则 return listA.every((line, index) => { // 场景1:对比对象的所有属性(适合结构简单、无特殊类型的对象) return JSON.stringify(line) === JSON.stringify(listB[index]); // 场景2:对比关键标识字段(更高效,适合复杂对象) // return line.id === listB[index].id && line.quantity === listB[index].quantity; }); }
然后修改原校验代码:
let check = saleBlockList.every(item => this.saleBlockList.every(saleBlock => areLineListsEqual(saleBlock.saleLineList, item.saleLineList) ) ); console.log('check', check);
2. 用JSON.stringify快速对比(适合简单场景)
如果你的saleLineList里没有函数、undefined、日期这类会被JSON序列化丢失的类型,可以直接把数组转成JSON字符串对比:
let check = saleBlockList.every(item => this.saleBlockList.every(saleBlock => JSON.stringify(saleBlock.saleLineList) === JSON.stringify(item.saleLineList) ) );
额外提示
你的原逻辑是检查saleBlockList中的每一项,都要和this.saleBlockList里的所有项的saleLineList相等——这意味着两个数组里的所有saleBlock的saleLineList必须完全一致。如果你实际需求是校验两个数组的结构和对应位置的项完全匹配,建议调整逻辑:
function areSaleBlockListsEqual(listA, listB) { if (listA.length !== listB.length) return false; return listA.every((block, index) => { return areLineListsEqual(block.saleLineList, listB[index].saleLineList); }); } let check = areSaleBlockListsEqual(saleBlockList, this.saleBlockList);
内容的提问来源于stack exchange,提问作者Cluadia Hedda
相关产品推荐
相关产品推荐

