数组去重的方法
1.利用ES6的Set方法去重
function unique(arr){ return Array.from(new Set(arr)) } var arr = [1,1,'true','true',true,true,15,15,false,false, undefined, undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; console.log(unique(arr)); //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}] //以上方法可以简化成[...new Set(arr)]
不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象,后面的高阶方法会添加去掉重复“{}”的方法。
2.利用filter
function unique(arr) { return arr.filter(function(item, index, arr) { //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素 return arr.indexOf(item, 0) === index; }); } var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; console.log(unique(arr)); //[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]
扩展:filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。如果没有符合条件的元素则返回空数组。
var array1 = [ { "id": 0, "info": "dsfffffffffffhd", "done": false }, { "id": 1, "info": "dsfffffffffffhd", "done": true }, { "id": 22, "info": "dsfffffffffffhd", "done": false }, { "id": 3, "info": "dsfffffffffffhd", "done": true }, { "id": 42, "info": "dsfffffffffffhd", "done": false }, { "id": 53, "info": "dsfffffffffffhd", "done": false }, { "id": 6, "info": "dsfffffffffffhd", "done": true } ] var ar = array1.filter(function(value, index, arr) { return value.done === true }) console.log(ar); value: 必须。当前元素的值 index: 可选。当前元素的索引值 arr: 可选。当前元素属于的数组对象
3.利用Map对象和数组的filter()方法
①Map对象是ES6提供的一个新的数据结构,其中has的办法是返回一个布尔值,表示某个值是否存在当前的Mp对象之中,set的办法是给Map对象设置key/value。
②filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
所以说,Map对象结合filter方法可以达到数组去重的效果~
var arr1 = [1, 2, 3, 1, 2, 4, NaN, undefined, NaN, undefined] function unique(arr) { const res = new Map() return arr.filter((a) => !res.has(a) && res.set(a)) } var newArr = unique(arr1) console.log(newArr);
4.利用Map数据结构去重
function arrayNonRepeatfy(arr) { let map = new Map(); let array = new Array(); // 数组用于返回结果 for (let i = 0; i < arr.length; i++) { if(map .has(arr[i])) { // 如果有该key值 map .set(arr[i], true); } else { map .set(arr[i], false); // 如果没有该key值 array .push(arr[i]); } } return array ; } var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; console.log(unique(arr)) //[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]
5.利用find()去重
//find()方法返回数组中符合条件的第一个元素。否则返回undefined let arr = [{ a: 1, b: 2 }, { a: 1, b: 3 }, { a: 2, b: 1 }, { a: 1, b: 2 }] let sss = arr.find((child)=>(child.a == 5)) console.log(sss);//undefined console.log(!sss);//true let ddd = arr.find((child)=>(child.a == 1)) console.log(ddd);//{ a: 1, b: 2 } console.log(!ddd);//false //去重 let newArr = []; arr.forEach(item => { const obj = newArr.find(child => child == JSON.stringify(item)) if (!obj) { newArr.push(JSON.stringify(item)) } }) const res = newArr.map(item => JSON.parse(item)) console.log(res);//[{ a: 1, b: 2 }, { a: 1, b: 3 }, { a: 2, b: 1 }]
6.利用下标查询
function unique(arr){ let newArr = [arr[0]]; for(let i=0;i<arr.length;i++){ if(newArr.indexOf(arr[i])==-1){ //或者newArr.includes(arr[]) newArr.push(arr[i]); } } return newArr; } var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]; console.log(unique(arr)) //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}] //{}没有去重
7.最基本的去重方法for嵌套for
//定义一个新数组,并存放原数组的第一个元素,然后将原数组一一和新数组的元素对比,若不同则存放在新数组中 let arr = [1,2,3,3,4,6,6]; let newArr = [arr[0]]; for(let i=0;i<arr.length;i++){ let repeat = false; for(let j=0;j<newArr.length;j++){ if(arr[i]==newArr[j]){ repeat = true; break; } } if(!repeat){ newArr.push(arr[i]) } } console.log(newArr);// [1, 2, 3, 4, 6]
8.先排序再去重
//先将原数组排序,再与相邻的进行比较,如果不同则存入新数组。 function unique(arr){ let arr2 = arr.sort(); let res = [arr2[0]]; for(let i=0;i<arr2.length;i++){ if(arr2[i] !== res[res.length-1]){ res.push(arr2[i]); } } return res; } var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr)) [0, 1, 15, NaN, NaN, "NaN", {…}, {…}, "a", false, null, "true", true, undefined]
⑨利用对象的属性去重(这种数组去重的方法有问题,不建议用)
//每次取出原数组的元素,然后在对象中访问这个属性,如果存在就说明重复 function unique(arr){ let res = []; let json = {}; for(let i=0;i<arr.length;i++){ if(!json[arr[i]]){ res.push(arr[i]); json[arr[i]] = 1; } } return res; } var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];console.log(unique(arr)) //[1, "true", 15, false, undefined, null, NaN, 0, "a", {…}] //两个true直接去掉了,NaN和{}去重