数组去重的方法

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和{}去重

 

posted @ 2021-11-23 14:34  小新没蜡笔哦  阅读(135)  评论(0编辑  收藏  举报