如何比对前端与数据库来源的两个对象数组数据是否一致?
数组对象字段比对问题
我有两个对象数组,json数组来自数据库,informacion数组来自前端,需要验证二者数据完全一致,具体需求:
- 比对两个数组的所有元素
- 按照指定字段映射逐字段比对
- 全部一致输出
Everything went well,否则输出there is an error
指定字段映射关系:
Trx↔TipoFecha↔FechaDePagoTermLoteCupon↔TransacciónTarj↔TarjetaVentasconDto↔Ventas
我之前用嵌套循环遍历比对,出现同一元素重复遍历的问题,试了filter方法也没实现,求解决方案。
原代码示例:
var json = [ { Transacción: "999999", Tarjeta: "0190", Tipo: "Contr ctdo", FechaDePago: "07/08/2022", Ventas: "-5.000,00", }, { Transacción: "999997", Tarjeta: "0194", Tipo: "Contr ctdo", FechaDePago: "06/08/2022", Ventas: "4.000,00", }, { Transacción: "999998", Tarjeta: "0195", Tipo: "Contr ctdo", "FechaDePago": "08/08/2022", Ventas: "6.000,00", }, ]; var informacion = [ { Trx: "Contr ctdo", Fecha: "07/08/2022", TermLoteCupon: "999999", Tarj: "0190", VentasconDto: "-5.000,00", }, { Trx: "Contr ctdo", Fecha: "06/08/2022", TermLoteCupon: "999997", Tarj: "0194", VentasconDto: "4.000,00", }, { Trx: "Contr ctdo", Fecha: "08/08/2022", TermLoteCupon: "999998", Tarj: "0195", VentasconDto: "6.000,00", }, ]; // 预期比对逻辑:前端数组与数据库数组完全匹配 // 字段对应关系: // Trx === Tipo // Fecha === FechaDePago // TermLoteCupon === Transacción // Tarj === Tarjeta // VentasconDto === Ventas // 我的实现代码: for (let i = 0; i < informacion.length; i++) { console.log('soy newarray', informacion[i]); for(let j = 0; j < json.length; j++){ console.log('soy json parseado',json[j]); if(json[j] == informacion[i]){ console.log('La informacion es compatible') }else{ console.log('Hay error.') } } }
解决方案
问题根源
原代码的核心问题:
- 直接用
==比对对象:对象是引用类型,只有指向同一个内存地址才会相等,永远无法匹配成功 - 嵌套循环重复遍历:每个前端元素都和所有数据库元素比对,既低效又无法准确判断数组是否完全匹配
实现思路
- 先校验数组长度:长度不一致直接判定不匹配
- 定义字段映射表:统一管理前后端字段对应关系,方便后续维护
- 构建数据库数组索引:用唯一标识(比如
Transacción交易号)将数据库数组转为键值对,避免嵌套循环的O(n²)复杂度 - 逐元素逐字段比对:遍历前端数组,通过索引快速找到对应数据库元素,逐个验证字段值
- 提前终止比对:一旦发现不匹配,立即终止循环,提升效率
最终代码
// 定义前后端字段映射关系:前端字段 → 数据库字段 const fieldMap = { Trx: 'Tipo', Fecha: 'FechaDePago', TermLoteCupon: 'Transacción', Tarj: 'Tarjeta', VentasconDto: 'Ventas' }; // 第一步:校验数组长度 if (informacion.length !== json.length) { console.log('there is an error'); } else { // 将数据库数组转为以交易号为key的对象,实现O(1)查找 const jsonIndexMap = json.reduce((map, item) => { map[item.Transacción] = item; return map; }, {}); let isAllMatch = true; // 遍历前端数组,逐个比对 for (const frontItem of informacion) { const transactionId = frontItem.TermLoteCupon; const dbItem = jsonIndexMap[transactionId]; // 找不到对应数据库元素,直接标记不匹配 if (!dbItem) { isAllMatch = false; break; } // 逐字段验证对应关系 for (const [frontField, dbField] of Object.entries(fieldMap)) { if (frontItem[frontField] !== dbItem[dbField]) { isAllMatch = false; break; } } if (!isAllMatch) break; } // 输出最终结果 console.log(isAllMatch ? 'Everything went well' : 'there is an error'); }
代码说明
- 字段映射表:把对应关系抽离成独立对象,后续修改字段只需调整此处,无需改动遍历逻辑
- 索引构建:用
reduce将数据库数组转为键值对,把查找时间从O(n)优化到O(1),大幅提升效率 - 提前终止:一旦发现元素缺失或字段不匹配,立即终止循环,避免不必要的计算
- 严谨校验:覆盖了长度不一致、元素缺失、字段值不匹配等所有可能的不匹配场景
内容的提问来源于stack exchange,提问作者Kike gonzalez
相关产品推荐
相关产品推荐

