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

如何不对比单独对象键、匹配完整对象后从对象数组中删除对应目标对象

实现思路

  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:36:03