JS判断对象是否存在于对象数组及去重方案

作者:异步漫步时间:2026-10-25 17:28:25浏览:445

本文探讨在JavaScript中判断对象是否存在于对象数组的两种常见场景:添加前校验与数组去重。第一种场景利用JSON.stringify序列化结合ES6的includes方法实现存在性检查;第二种场景介绍使用lodash库的uniqWith方法配合isEqual函数进行深层比较,从而高效完成对象数组的去重处理。

场景:

存在一个对象数组,例如:

var arr = [{"appName":"小何","appId":"1"},{"appName":"小王","appId":"2"}]

通常涉及两种常见情况:

第一种情况,例如点击按钮向数组中 push()添加对象时,若数组内已存在该对象,则需提示禁止添加。

第二种情况,在 push()操作后进行去重处理,即实现对象数组的去重。

第一种场景的解决方案:若数组中已存在对象,则禁止添加

利用 includes() 方法,其含义为判断是否存在,存在时返回 true,不存在时返回 false。关键点在于需结合 JSON.stringify() 将对象序列化为字符串后再进行判断,示例代码如下:

var arr = [{"appName":"小何","appId":"1"},{"appName":"小王","appId":"2"}]
 
var obj = {"appName":"小王","appId":"2"}
 
//如果数组arr中不存在字符串JSON.stringify(obj),那就可以添加,反之,则不添加
if(JSON.stringify(arr).includes(JSON.stringify(obj)) === false){
     console.log('不存在')
     arr.push(obj)
}else{
     console.log('已存在')
}

总结:

ES6 新增的 includes() 方法功能强大,适用于字符串、数组及对象,返回布尔值。相较于常用的 indexof(),includes()具有更强的语义化,且性能表现良好!

第二种场景的解决方案:对象数组去重

我对对象数组去重的理解如下:

即对象的属性与值必须完全一致,且对象长度也必须相同。

这意味着 key 和 value 必须完全一致,且数量不能多也不能少。

尝试手写实现时嵌套了多层循环,导致性能不佳。现提供一步到位的最优解,代码如下:

lodash 是前端常用的 JS 方法库,它将多种方法封装起来以方便使用。

使用 lodash 的_.uniqWith()方法,结合_.isEqual比较函数,即可较为完美的解决问题。

需要注意的是,_.isEqual()方法也是非常强大的,作用是比较两个对象是否相等,这个方法非常实用,我经常用它,他是深层递归的,推荐。

场景:

代码示例:

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

至此,关于判断对象是否存在于对象数组中的文章介绍完毕。如需了解更多 js 判断对象在对象数组中的相关内容,请搜索本站历史文章或继续浏览下方相关文章,希望大家日后多多支持本站!

作者最新文章