如何不对比单独对象键、匹配完整对象后从对象数组中删除对应目标对象
实现思路
- JS对象为引用类型,直接
===对比仅校验内存地址是否一致,不会匹配对象内部属性值 - 先实现通用深相等校验方法,覆盖基础类型、数组、普通对象的对比场景
- 基于深相等方法过滤原数组,排除和待删除对象完全匹配的项
完整实现代码
// 通用深相等校验方法 function isDeepEqual(val1, val2) { // 基础类型/引用地址一致直接返回true if (val1 === val2) return true // 处理null/非对象类型的不相等情况 if (val1 == null || typeof val1 !== 'object' || val2 == null || typeof val2 !== 'object') { return false } // 数组和对象类型不匹配的情况 const isArr1 = Array.isArray(val1) const isArr2 = Array.isArray(val2) if (isArr1 !== isArr2) return false // 数组对比 if (isArr1) { if (val1.length !== val2.length) return false return val1.every((item, index) => isDeepEqual(item, val2[index])) } // 普通对象对比 const keys1 = Object.keys(val1) const keys2 = Object.keys(val2) if (keys1.length !== keys2.length) return false return keys1.every(key => Object.prototype.hasOwnProperty.call(val2, key) && isDeepEqual(val1[key], val2[key])) } // 原始数据 let originalArray = [ {name: 'abc', country: 'eng'}, {name: 'xyz', country: 'ind'}, {name: 'pqr', country: 'us'} ] let objectToBeRemove = [ {name: 'pqr', country: 'us'} ] // 过滤数组:保留和所有待删除对象都不匹配的项 originalArray = originalArray.filter(item => { return !objectToBeRemove.some(removeItem => isDeepEqual(item, removeItem)) }) console.log(originalArray)
输出结果
[ { name: 'abc', country: 'eng' }, { name: 'xyz', country: 'ind' } ]
注:如果需要修改原数组而不是返回新数组,可以用
splice遍历删除,上述filter方法返回新数组的方式更符合不可变原则,适配绝大多数通用场景。
内容的提问来源于stack exchange,提问作者techguy
相关产品推荐
相关产品推荐

