如何比较键顺序不同但键值对一致的两个JavaScript对象并返回true?
如何比较键顺序不同但键值对完全相同的JavaScript对象
嘿,这个问题我太熟了!直接用===或者==肯定不行,因为JavaScript里对象是引用类型,只有当两个变量指向同一个内存地址的对象时,比较结果才会是true。但你这两个对象是独立创建的,哪怕键值对完全一样,引用也不同。下面给你几种靠谱的解决方法:
方法一:基础遍历比较(适合简单对象)
这个方法最直观,先检查两个对象的键数量是否一致,然后遍历其中一个对象的所有键,逐一对比对应的值:
function areObjectsEqual(obj1, obj2) { // 先获取两个对象的键数组 const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); // 如果键的数量不一样,直接返回false if (keys1.length !== keys2.length) return false; // 遍历每个键,对比值 for (const key of keys1) { if (obj1[key] !== obj2[key]) return false; } return true; } // 测试你的例子 var i = { key1: 'value1', key2: 'value2' }; var j = { key2: 'value2', key1: 'value1' }; console.log(areObjectsEqual(i, j)); // 输出 true
注意:这个方法只适合没有嵌套对象的情况,如果值里还有对象、数组,就需要递归处理了。
方法二:JSON序列化+键排序(适合简单/嵌套对象,但有局限性)
如果你不想写复杂的遍历,可以利用JSON.stringify,但要先把对象的键按顺序排列,这样不管原对象键的顺序如何,序列化后的字符串都是一样的:
function areObjectsEqual(obj1, obj2) { // 定义一个排序函数,把对象的键按字母顺序排列后序列化 const sortedStringify = (obj) => JSON.stringify(Object.keys(obj).sort().reduce((acc, key) => { acc[key] = obj[key]; return acc; }, {})); return sortedStringify(obj1) === sortedStringify(obj2); } // 测试 var i = { key1: 'value1', key2: 'value2' }; var j = { key2: 'value2', key1: 'value1' }; console.log(areObjectsEqual(i, j)); // 输出 true
⚠️ 局限性:如果对象里包含undefined、function、Symbol类型的值,JSON.stringify会忽略这些键,或者把function转为null,这时候结果就不准确了。另外,日期对象会被转为字符串,如果你需要区分日期对象和相同的字符串,这个方法也不适用。
方法三:递归深度比较(适合所有类型的对象)
如果你的对象可能有嵌套对象、数组,那最好写一个递归的比较函数,处理所有情况:
function areObjectsEqual(obj1, obj2) { // 如果两个是同一个引用,直接返回true if (obj1 === obj2) return true; // 检查是否都是数组 if (Array.isArray(obj1) && Array.isArray(obj2)) { if (obj1.length !== obj2.length) return false; for (let i = 0; i < obj1.length; i++) { if (!areObjectsEqual(obj1[i], obj2[i])) return false; } return true; } // 检查是否都是对象(且不是null、不是数组) if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) { return obj1 === obj2; } // 获取键数组并检查数量 const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; // 遍历每个键,递归比较值 for (const key of keys1) { if (!keys2.includes(key) || !areObjectsEqual(obj1[key], obj2[key])) { return false; } } return true; } // 测试嵌套对象的情况 var i = { key1: 'value1', key2: { nestedKey: 'nestedValue' } }; var j = { key2: { nestedKey: 'nestedValue' }, key1: 'value1' }; console.log(areObjectsEqual(i, j)); // 输出 true
这个方法几乎能处理所有常见的情况,包括嵌套对象、数组,实用性拉满!
内容的提问来源于stack exchange,提问作者msv96
相关产品推荐
相关产品推荐

