广告

JavaScript中如何判断两个对象所有键对应的数组长度是否相等?完整实现与代码示例

问题背景与需求

在前端与后端数据交互中,我们经常需要比较两个对象是否在结构和数据维度上一致。本文聚焦于一个具体问题:JavaScript中如何判断两个对象所有键对应的数组长度是否相等? 这个需求要求我们不仅要比对键名是否相同,还要确保每个键对应的值都是数组,并且这两个数组的长度相等。确保错误输入(如某些键缺失、或对应值不是数组)也能被正确处理,是实现的关键要点。

通过对键集合进行对比、对每个键的数组长度进行逐一比对,可以实现一个鲁棒的判断函数。下面的实现既直观又高效,适用于中等规模对象。

实现思路与设计要点

核心判断逻辑

核心思路是先对两个对象的键集合进行严格比较,确保两者拥有完全相同的键名集合。随后,逐键检查对应的值是否都是数组,以及数组长度是否相等。一旦发现任意键缺失、类型不符或长度不同,即返回 false,保证结果的严格性。

这种做法的时间复杂度为 O(n),其中 n 是键的数量;空间复杂度为 O(n),用于临时存放键集合与迭代变量。正确处理空对象和嵌套结构并不在此实现的范围之内,若需要,应在扩展版本中加入类型断言与边界检查。

边界条件与鲁棒性

在设计时,我们需要明确以下边界情况:两个对象的键集合不同,或者某个键对应的值不是数组,应该直接返回 false;如果两个对象都是空对象,结果应为 true。对键是否存在、数组类型的严格校验,是避免错误判定的关键。

此外,若需要兼容某些特殊数据结构(如带原型链的对象),也可以通过 Object.prototype.hasOwnProperty.call 来进行存在性检查,提升兼容性。

完整实现代码示例

核心函数说明

下面给出一个完整实现,函数名为 areAllArrayLengthsEqual,接收两个对象参数,返回布尔值。实现逻辑包括键集合对比、类型判断和长度比较,符合题意“两个对象所有键对应的数组长度是否相等”的要求。

请复制到你的项目中测试,确保在实际用例中也能工作。

/*** 判断两个对象所有键对应的数组长度是否相等* 要求:* - 两对象的键集合完全相同* - 每个键的值都是数组* - 对应数组长度相等*/
function areAllArrayLengthsEqual(objA, objB) {// 获取键集合const keysA = Object.keys(objA);const keysB = Object.keys(objB);// 边界:键数量不同则直接返回 falseif (keysA.length !== keysB.length) return false;// 逐键比较for (const key of keysA) {// 存在性检查,确保 objB 也有该键if (!Object.prototype.hasOwnProperty.call(objB, key)) {return false;}const valA = objA[key];const valB = objB[key];// 类型检查:要求都是数组if (!Array.isArray(valA) || !Array.isArray(valB)) {return false;}// 长度比较if (valA.length !== valB.length) {return false;}}// 如果通过以上所有检查,返回 truereturn true;
}// 示例测试
const a = { x: [1,2,3], y: ['a'] };
const b = { x: [9,9,9], y: ['b'] };
console.log(areAllArrayLengthsEqual(a, b)); // trueconst c = { x: [1,2], y: [] };
const d = { x: [0,0], y: [1] };
console.log(areAllArrayLengthsEqual(c, d)); // trueconst e = { x: [1,2], y: [3] };
const f = { x: [1], y: [2,3] };
console.log(areAllArrayLengthsEqual(e, f)); // false// 错误示例:键不匹配或非数组值
console.log(areAllArrayLengthsEqual({a: [1]}, {a: [2], b: []})); // false
console.log(areAllArrayLengthsEqual({a: 1}, {a: [1]})); // false

进阶技巧与变体

使用 Set 实现的等价性检查

如果你想把两个对象的键集合并为一个全集,再进行遍历,也可以使用 Set 来去重合并键。这种变体对理解键集合全局一致性很直观,但在大对象中性能边界相近。

下面展示一个使用 Set 的实现版本,保持与前述逻辑一致的边界检查和长度比较。

function areAllArrayLengthsEqualSet(a, b) {const keys = new Set([...Object.keys(a), ...Object.keys(b)]);// 如果存在某个键只在其中一个对象中,则直接返回 falsefor (const key of keys) {if (!(key in a) || !(key in b)) return false;const va = a[key];const vb = b[key];if (!Array.isArray(va) || !Array.isArray(vb)) return false;if (va.length !== vb.length) return false;}return true;
}// 参考测试
console.log(areAllArrayLengthsEqualSet({m:[1,2]}, {m:[3,4]})); // true
console.log(areAllArrayLengthsEqualSet({m:[1]}, {n:[2]})); // false

测试用例与验证

示例对象及预期结果

为了帮助你快速验证实现,下面给出一组示例对象及其期望结果。请在本地浏览器或 Node 环境中运行,以确保符合你的用例边界。

示例 1:完全匹配的键与数组长度

const t1 = { a:[1,2,3], b:[4,5] };
const t2 = { a:[0,0,0], b:[9,9] };
console.log(areAllArrayLengthsEqual(t1, t2)); // true

示例 2:键缺失或类型不匹配导致失败

JavaScript中如何判断两个对象所有键对应的数组长度是否相等?完整实现与代码示例

console.log(areAllArrayLengthsEqual({a:[1,2]}, {a:[3], b:[]})); // false
console.log(areAllArrayLengthsEqual({a: 'str'}, {a: ['x']})); // false

广告