You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:42:45