You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从对象数组中删除一个完全匹配的指定对象(仅删一次)

深度匹配并删除数组中单个完全匹配的对象

可行,但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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:10:08