参考文章:浅析JS如何实现数组去重
ES6语法Set实现数组去重
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
var array = [1, 2, 1, 1, '1'];function unique(array) {return Array.from(new Set(array));}console.log(unique(array)); // [1, 2, "1"]//可以简化为function unique(array) {return [...new Set(array)];}
双重循环来实现数组去重
使用双重for循环将数组中数据一次对比,将相同数据筛去。一般来说,这种方法适用性是比较好的。
var array = [1, 1, '1', '1'];function unique(array) {// res用来存储结果var res = [];for (var i = 0, arrayLen = array.length; i < arrayLen; i++) {for (var j = 0, resLen = res.length; j < resLen; j++ ) {if (array[i] === res[j]) {break;}}// 如果array[i]是唯一的,那么执行完循环,j等于resLenif (j === resLen) {res.push(array[i])}}return res;}console.log(unique(array)); // [1, "1"]
splice实现
也可以不创建新的数组,而是使用splice方法将数组中相同的删掉
function unique(arr){for(var i=0; i<arr.length; i++){for(var j=i+1; j<arr.length; j++){if(arr[i]==arr[j]){ //第一个等同于第二个,splice方法删除第二个arr.splice(j,1);j--;}}}return arr;}
indexOf实现
同样也是双重循环,判断条件从两数相等变为用indexOf判断
function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}var array = [];for (var i = 0; i < arr.length; i++) {if (array .indexOf(arr[i]) === -1) {array .push(arr[i])}}return array;}
利用sort实现
先使用sort方法将数组排序重组,之后比较相邻位置大小,双重循环的变种
function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return;}arr = arr.sort()var arrry= [arr[0]];for (var i = 1; i < arr.length; i++) {if (arr[i] !== arr[i-1]) {arrry.push(arr[i]);}}return arrry;}
利用includes
function unique(arr) {if (!Array.isArray(arr)) {console.log('type error!')return}var array =[];for(var i = 0; i < arr.length; i++) {if( !array.includes( arr[i]) ) {//includes 检测数组是否有某个值array.push(arr[i]);}}return array}
利用hasOwnProperty
function unique(arr) {var obj = {};return arr.filter(function(item, index, arr){return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)})}
利用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 ;}
利用for…of + Object
首先创建一个空对象,然后用 for 循环遍历
利用对象的属性不会重复这一特性,校验数组元素是否重复
function distinct(a, b) {let arr = a.concat(b)let result = []let obj = {}for (let i of arr) {if (!obj[i]) {result.push(i)obj[i] = 1}}return result}
