在项目中定义对象数组是非常常见的, 这就免不了要对对象数组进行去重. 当然不能简单的使用 === 来解决问题, 因为这时候数组中的类型为对象类型, 即使完全相同的两个对象也不相等的. 下面的例子说明一切:
- {
- }==={
- }//fasle
- []===[]//fasle
所以应该使用其他方法来判断两个对象是否相等, 能代表这个对象的唯一性的属性, 比如 id.
使用 id 举例:
- var arr=[
- {id:01,name:'jack'},
- {id:02,name:'tome'},
- {id:01,name:'jack'},
- ]
方法一: 使用对象的 hasOwnProperty 属性
- var deRepeat=function(arr){
- let obj={};
- arr.forEach((item,index)=>{
- // 若重复则删除该项
- if(obj.hasOwnProperty(item.id)){
- arr.splice(index,1);
- // 不重复则存入 obj
- }else{
- obj[item.id]=item.name;
- }
- });
- return arr;
- }
方法二: 使用数组的归并方法 reduce, 注意该方法接收两个参数 (函数)
参数 1(操作): 在每一项上调用的函数, 接收四个参数: pre(经过参数 1 中函数操作过后存入结果中的的值, 相对于当前操作项为前一个值, 可以说这个参数就是参数 2),cur(当前项的值),index(当前值索引),arr(数组)
参数 2(结果): 初始值
- var deRepeat=function(arr){
- let obj={};
- let res=arr.reduce(function(pre,cur,index,arr){
- // 当前项还没出现过, 至今未发现重复项
- if(!obj.hasOwnProperty(cur.id)){
- obj[cur.id]=cur.name;
- pre.push(cur)
- }
- return pre;
- },[])
- return arr;
- }
来源: http://www.bubuko.com/infodetail-2928405.html