如何从对象数组中删除一个完全匹配的指定对象(仅删一次)
深度匹配并删除数组中单个完全匹配的对象
可行,但JavaScript中对象是引用类型,直接用===无法判断嵌套对象的内容是否完全一致,必须先实现深度相等判断逻辑,再定位到第一个匹配的元素进行删除。
实现步骤
- 编写深度相等函数,递归比较对象的所有嵌套属性(包括数组、子对象)
- 找到数组中第一个与目标对象深度相等的元素索引
- 通过索引删除该元素(确保只删一个)
完整代码示例
const arr=[ { "id": "C3-Delta-65", "name": "C3-Delta-65", "carts": [ { "id": "full", "name": "Full Cart", "weight": 0, "volume": 0, "dimensions": { "length": 0, "breadth": 0, "height": 0 }, "quantity": 5 }, { "id": "half", "name": "Half Cart", "weight": 0, "volume": 0, "dimensions": { "length": 0, "breadth": 0, "height": 0 }, "quantity": 3 }, { "id": "smu", "name": "SMU", "weight": 0, "volume": 0, "dimensions": { "length": 0, "breadth": 0, "height": 0 }, "quantity": 2 } ] }, { "name": "C3-Delta-65", "id": "C3-Delta-65", "carts": [ { "id": "full", "name": "Full Cart", "weight": 0, "volume": 0, "dimensions": { "length": 0, "breadth": 0, "height": 0 }, "quantity": 5 }, { "id": "half", "name": "Half Cart", "weight": 0, "volume": 0, "dimensions": { "length": 0, "breadth": 0, "height": 0 }, "quantity": 3 }, { "id": "smu", "name": "SMU", "weight": 0, "volume": 0, "dimensions": { "length": 0, "breadth": 0, "height": 0 }, "quantity": 2 } ] }, { "name": "B1-Bravo-31", "id": "B1-Bravo-31", "carts": [ { "quantity": 3, "dimensions": { "height": 0, "breadth": 0, "length": 0 }, "volume": 0, "weight": 0, "name": "Full Cart", "id": "full" }, { "quantity": 4, "dimensions": { "height": 0, "breadth": 0, "length": 0 }, "volume": 0, "weight": 0, "name": "Half Cart", "id": "half" }, { "quantity": 2, "dimensions": { "height": 0, "breadth": 0, "length": 0 }, "volume": 0, "weight": 0, "name": "SMU", "id": "smu" } ] } ]; const rem={ "name": "C3-Delta-65", "id": "C3-Delta-65", "carts": [ { "quantity": 5, "dimensions": { "height": 0, "breadth": 0, "length": 0 }, "volume": 0, "weight": 0, "name": "Full Cart", "id": "full" }, { "quantity": 3, "dimensions": { "height": 0, "breadth": 0, "length": 0 }, "volume": 0, "weight": 0, "name": "Half Cart", "id": "half" }, { "quantity": 2, "dimensions": { "height": 0, "breadth": 0, "length": 0 }, "volume": 0, "weight": 0, "name": "SMU", "id": "smu" } ] }; // 深度相等判断函数 function deepEqual(a, b) { // 基本类型或引用直接相等的情况 if (a === b) return true; // 排除非对象或null的情况 if (a == null || typeof a !== 'object' || b == null || typeof b !== 'object') return false; // 键数量不同直接不相等 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; } // 找到第一个匹配项的索引 const matchIndex = arr.findIndex(item => deepEqual(item, rem)); // 删除第一个匹配的元素 if (matchIndex !== -1) { arr.splice(matchIndex, 1); } // 验证结果 console.log(arr);
补充说明
- 手写的
deepEqual函数覆盖了嵌套对象、数组的深度比较需求,确保内容完全一致才判定匹配 findIndex仅返回第一个匹配项的索引,配合splice实现只删除一个目标元素的要求- 如果你的项目已经引入Lodash等工具库,可以直接用
_.isEqual替代手写的deepEqual,逻辑更严谨
内容的提问来源于stack exchange,提问作者bugsmasher
相关产品推荐
相关产品推荐

