值得收藏!!javascript数组中多条对象去重方式,很实用!!!
在数组中都是数字的时候很好去重,例如:var arr=[1,2,2,2,3,4,5,4,5,3,6];可以用两层for循环或者其他方式进行去重
我在这里也给出一个方法吧:
Array.prototype.distinct = function (){ var arr = this, len = arr.length; arr.sort(function(a,b){ //对数组进行排序才能方便比较 return a - b; }) function loop(index){ if(index >= 1){ if(arr[index] === arr[index-1]){ arr.splice(index,1); } loop(index - 1); //递归loop函数进行去重 } } loop(len-1); return arr; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,56,45,56]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,45,56
在数组中都是对象的时候就需要设置布尔值来进行去重操作,原理也是两层for循环,但是在第一层for循环内需要定义布尔值为true,用来维持一个量,之后在内层for循环中进行比对,如果按照某个条件比对满足的话,布尔值就为false,之后在第一层for循环里第二层for循环外进行布尔判断,如果为真,将数据插入到新数组,如果不为真,则不用添加,从此达到了数组去重的功能,以下是代码演示
var oldArr = [ {id:1,name:"zhangs",age:18,contact_id:1}, {id:1,name:"zhangs",age:18,contact_id:2}, {id:1,name:"zhangs",age:18,contact_id:3}, {id:1,name:"zhangs",age:18,contact_id:14}, {id:1,name:"zhangs",age:18,contact_id:3}, {id:1,name:"zhangs",age:18,contact_id:2}, {id:1,name:"zhangs",age:18,contact_id:1} ];//原数据数组 var allArr = [];//新数组
1.该方法为jquery方法
$.each(oldArr,function(i,v){ var flag = true; if(allArr.length > 0){ $.each(allArr,function(n,m){ if(allArr[n].contact_id == oldArr[i].contact_id){flag = false;}; }); }; if(flag){ allArr.push(oldArr[i]); }; });
2.原生js方法
for(var i=0;i<oldArr.length;i++){ var flag = true; for(var j=0;j<allArr.length;j++){ if(oldArr[i].id == allArr[j].id){ flag = false; }; }; if(flag){ allArr.push(oldArr[i]); }; };
封装一下,方便调用:
function qcArr(arr,name){ var allArr = []; for(var i=0;i<arr.length;i++){ var flag = true; for(var j=0;j<allArr.length;j++){ if(arr[i].name == allArr[j].name){ flag = false; }; }; if(flag){ allArr.push(arr[i]); }; }; return allArr; }
去重保留最新的(最后一个)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> var oldArr = [ { busCode: "123", key: '1' }, { busCode: "123", key: '2' }, { busCode: "123", key: '3' }, { busCode: "123", key: '4' }, { busCode: "123", key: '5' }, { busCode: "123", key: '6' }, { busCode: "123", key: '7' }, { busCode: "1231", key: '8' } ]; console.log(oldArr) var allArr = [];//新数组 //websocket 加入新数据 // oldArr.unshift({ busCode: "123", key: '0' }) oldArr.push({ busCode: "123", key: '9' }) for (var i = oldArr.length - 1; i >= 0; i--) { var flag = true; for (var j = allArr.length - 1; j >= 0; j--) { if (oldArr[i].busCode == allArr[j].busCode) { flag = false; }; }; if (flag) { allArr.push(oldArr[i]); }; }; console.log(allArr) </script> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通