如何动态过滤含多种对象结构的数组并判断对象是否存在?
解决方案:判断多结构对象是否存在于数组中
核心问题分析
你之前的方法失效原因:
arr.find(obj)报错:find需要传入回调函数,直接传对象会被当作函数执行,所以报错arr.includes(obj)和element === obj失效:JS中对象是引用类型,只有引用同一个内存地址时才会相等,内容相同但地址不同的对象会被判定为不等- 硬编码字段比较:因为数组内对象结构多样,无法统一指定比较字段,导致结构不同时报错
推荐方案一:使用Lodash的深度比较方法
Lodash的_.isEqual方法支持深度递归比较任意类型的值,不管对象结构是否一致,只要内容完全匹配就返回true,完美适配你的场景。
代码示例:
// 先确保已引入Lodash(前端可通过npm install lodash,或者CDN引入) const _ = require('lodash'); // Node.js环境 // 或 import _ from 'lodash'; // ES6环境 const arr = [ {name:"aaa",time:15}, {name:"aaa",time:22}, {timeline: "250", chars:[{a:1},{b:2},{c:3}]}, {timeline: "220", chars:[{d:4},{e:5},{f:6}]}, ]; const obj = {name:"aaa",time:22}; // 使用some结合isEqual,找到匹配项就立即返回true,性能更优 const isExists = arr.some(item => _.isEqual(item, obj)); console.log(isExists); // 输出 true
推荐方案二:原生JS实现深度比较函数
如果不想引入第三方库,可以自己实现一个简易的深度比较函数,覆盖对象、数组、基本类型的比较场景:
代码示例:
function deepEqual(a, b) { // 基本类型直接比较 if (a === b) return true; // 处理null/undefined的情况 if (a == null || b == null) return false; // 比较构造函数,确保类型一致(比如都是Object或都是Array) if (a.constructor !== b.constructor) return false; // 处理数组类型 if (Array.isArray(a)) { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) { if (!deepEqual(a[i], b[i])) return false; } return true; } // 处理对象类型 if (a instanceof Object) { const keysA = Object.keys(a); const keysB = Object.keys(b); if (keysA.length !== keysB.length) return false; for (const key of keysA) { if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false; } return true; } return false; } // 使用方式 const isExists = arr.some(item => deepEqual(item, obj)); console.log(isExists); // 输出 true
注意事项
- 上述两种方案都能处理嵌套数组/对象的深度比较,比如示例中
chars数组里的嵌套对象也能正确匹配 - 如果数组规模很大,
some方法的性能优于filter,因为some找到第一个匹配项就会终止遍历
内容的提问来源于stack exchange,提问作者ABpositive
相关产品推荐
相关产品推荐

