如何从含对象的多维数组中提取存在不匹配值的对象?
解决两个对象数组的不匹配值检测问题
嘿,我来帮你搞定这个对比对象数组的问题!你需要找出两个数组里那些存在值不匹配的对象对吧?下面给你分享纯JavaScript和jQuery两种实现方案,逻辑清晰还能覆盖常见的场景。
先明确场景(模拟你的数组)
首先我先补全你给出的数组,假设第二个对比数组是这样的(你可以根据实际情况修改):
const firstArray = [ {'name':'alex','age':22,'numbersOne':['111','222','333','444','555'],'location':'iq'}, {'name':'jan','age':33,'numbersOne':['999','111','222','333','444'],'location':'in'} ]; const secondArray = [ {'name':'alex','age':23,'numbersOne':['111','222','333','444','555'],'location':'iq'}, {'name':'jan','age':33,'numbersOne':['999','111','222','333','555'],'location':'us'} ];
纯JavaScript解决方案
这个方案不依赖任何框架,轻量高效,能处理基本类型和数组类型的值对比,还会检查键的存在差异:
function findMismatchedObjects(arr1, arr2) { const mismatched = []; // 遍历两个数组的对应对象 for (let i = 0; i < Math.min(arr1.length, arr2.length); i++) { const obj1 = arr1[i]; const obj2 = arr2[i]; const mismatchedFields = []; // 检查obj1的所有键在obj2中的匹配情况 for (const key in obj1) { if (!obj2.hasOwnProperty(key)) { mismatchedFields.push(`对象缺少键:${key}`); continue; } const val1 = obj1[key]; const val2 = obj2[key]; // 处理数组类型的值 if (Array.isArray(val1) && Array.isArray(val2)) { if (val1.length !== val2.length) { mismatchedFields.push(`数组${key}长度不匹配:${val1} vs ${val2}`); } else { const hasMismatch = val1.some((item, idx) => item !== val2[idx]); if (hasMismatch) { mismatchedFields.push(`数组${key}内容不匹配:${val1} vs ${val2}`); } } } else { // 基本类型直接对比 if (val1 !== val2) { mismatchedFields.push(`字段${key}值不匹配:${val1} vs ${val2}`); } } } // 检查obj2是否有obj1没有的键 for (const key in obj2) { if (!obj1.hasOwnProperty(key)) { mismatchedFields.push(`对象多出键:${key}`); } } // 如果有不匹配项,记录该对象 if (mismatchedFields.length > 0) { mismatched.push({ originalObject: obj1, comparedObject: obj2, mismatches: mismatchedFields }); } } // 处理数组长度不一致的情况 if (arr1.length > arr2.length) { for (let i = arr2.length; i < arr1.length; i++) { mismatched.push({ originalObject: arr1[i], comparedObject: null, mismatches: ['该对象在第二个数组中不存在'] }); } } else if (arr2.length > arr1.length) { for (let i = arr1.length; i < arr2.length; i++) { mismatched.push({ originalObject: null, comparedObject: arr2[i], mismatches: ['该对象在第一个数组中不存在'] }); } } return mismatched; } // 使用示例 const result = findMismatchedObjects(firstArray, secondArray); console.log('存在不匹配的对象信息:', result);
逻辑说明
- 逐个对比两个数组对应位置的对象
- 区分数组和基本类型的对比逻辑:数组会检查长度和每一项内容
- 同时检测两个对象之间的键是否存在差异(一个有一个没有)
- 处理数组长度不一致的情况,把多余的对象也记录下来
- 返回结果包含原对象、对比对象和所有不匹配细节,方便排查
jQuery版本解决方案
如果你的项目已经引入了jQuery,也可以用$.each简化遍历逻辑,核心逻辑和纯JS一致:
function findMismatchedObjectsWithJQuery(arr1, arr2) { const mismatched = []; // 遍历第一个数组的对象 $.each(arr1, function(i, obj1) { const obj2 = arr2[i]; const mismatchedFields = []; if (!obj2) { mismatched.push({ originalObject: obj1, comparedObject: null, mismatches: ['该对象在第二个数组中不存在'] }); return; } // 对比obj1的键值 $.each(obj1, function(key, val1) { if (!obj2.hasOwnProperty(key)) { mismatchedFields.push(`对象缺少键:${key}`); return; } const val2 = obj2[key]; if (Array.isArray(val1) && Array.isArray(val2)) { if (val1.length !== val2.length || !val1.every((item, idx) => item === val2[idx])) { mismatchedFields.push(`数组${key}不匹配:${val1} vs ${val2}`); } } else if (val1 !== val2) { mismatchedFields.push(`字段${key}不匹配:${val1} vs ${val2}`); } }); // 检查obj2多余的键 $.each(obj2, function(key) { if (!obj1.hasOwnProperty(key)) { mismatchedFields.push(`对象多出键:${key}`); } }); if (mismatchedFields.length) { mismatched.push({ originalObject: obj1, comparedObject: obj2, mismatches: mismatchedFields }); } }); // 处理第二个数组多余的对象 if (arr2.length > arr1.length) { $.each(arr2.slice(arr1.length), function(i, obj) { mismatched.push({ originalObject: null, comparedObject: obj, mismatches: ['该对象在第一个数组中不存在'] }); }); } return mismatched; } // 使用示例 const jqueryResult = findMismatchedObjectsWithJQuery(firstArray, secondArray); console.log('jQuery版本结果:', jqueryResult);
自定义调整建议
如果你的场景有特殊需求,可以修改逻辑:
- 数组不关心顺序:可以先对数组排序再对比,比如
const sortedVal1 = [...val1].sort();后再用every对比 - 只对比指定键:可以提前定义需要对比的键数组,只遍历这些键即可
- 忽略某些字段:在遍历的时候跳过不需要对比的键
内容的提问来源于stack exchange,提问作者Alan Nama Yosuf
相关产品推荐
相关产品推荐

