【超全整理】JS数组去重到底有几种方法?

【超全整理】JS数组去重到底有几种方法?,第1张

文章目录 前言一、利用set去重二、双层for循环+splice三、利用indexOf去重四、使用includes五、sort() 方法去重六、利用hasOwnProperty()七、利用hash表八、使用Map


前言
const arr = [1, 1, '1', 11, true, false, false, 'true', 'a', {}, {}];
// 写一个unique方法实现去重
//unique(arr) => [1, '1', 11, true, false, 'true', 'a', {}, {}]

一、利用set去重

使用ES6提供的数据结构Set,代码简洁,但注意有兼容性问题

function unique (arr) {
  return Array.from(new Set(arr))
}
二、双层for循环+splice

思路:遍历数组拿当前项与后边所有项对比,若相同删除重复项

function unique (arr) {
 let len = arr.length;
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        len--;
        j--;
      }
    }
  }
  return arr;
  }
三、利用indexOf去重

使用indexOf方法有两种思路实现去重。
思路一: 遍历数组判断新数组中有没有当前项,没有放入新数组

function unique (arr) {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (res.indexOf(arr[i]) === -1) res.push(arr[i]);
  }
  return res;
}

思路二: 将第一项放进新数组,从第二项开始遍历,若当前项元素在数组第一次出现的位置不等于当前的位置,则代表此元素前边已经存在,忽略掉,否则放进新数组。

function unique (arr) {
  const res = [arr[0]];
  for (let i = 1; i < arr.length; i++) {
    if (arr.indexOf(arr[i]) === i) res.push(arr[i]);
  }
  return res;
}
四、使用includes

其实这种方法和上边indexOf方法思路大同小异
includes() 此方法返回一个布尔值,判断给定的值是否存在于数组中,和字符串的includes方法基本类似

function unique (arr) {
  const res = [];
  for (let i = 0; i < arr.length; i++) {
    if (!res.includes(arr[i])) res.push(arr[i]);
  }
  return res;
}
五、sort() 方法去重

思路:先排序,相邻两项比较,若不相同放新数组,否则忽略

function unique (arr) {
  arr.sort()  // 注意细节,sort()方法没有返回值,会改变可变对象
  const res = [arr[0]];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] !== arr[i-1])  res.push(arr[i]);
  }
  return res;
}
六、利用hasOwnProperty()

hasOwnProperty() 方法:返回一个布尔值,表示对象自身属性中是否具有指定的属性。
思路:利用对象的键名不可重复的特点。

function unique (arr) {
   let obj = {};
  return arr.filter(function(item, index, arr){
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
   })
}
七、利用hash表

思路:也是利用对象的键名不可重复的特点。

function unique (arr) {
     var n = {},res=[]; //n为hash表,res为临时数组
	 for(var i = 0; i < arr.length; i++){ 
		if (!n[arr[i]]){ 
			n[arr[i]] = true; 
			res.push(arr[i]); 
		}
	}
	return res;
}
八、使用Map

思路:创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中,和上边hash的思路基本一致。

function unique (arr) {
  let map = new Map();
  let res= []; 
  for (let i = 0; i < arr.length; i++) {
        if (!map.has(arr[i])){ 
			map.set(arr[i], false); 
			res.push(arr[i]); 
		}
  } 
  return res;
}

大概就想到了这么多,希望可以帮助到你,欢迎交流补充,我们共同学习共同进步!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1321024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-11
下一篇 2022-06-11

发表评论

登录后才能评论

评论列表(0条)

保存