JS中数组去重的九方法
数组去重方法
方法一:运用set结构特点:存储的数据没有重复的,结果为对象,再用Array.from()转换成数组
var arr = [1,1,2,1,3,4,5]; var set = new Set(arr); console.log(Array.from(set))
方法二 用ES5新增的indexOf()和push()方法 (非常简便好理解)
function norepeat(arr){ var newarr = []; for(var i in arr){ if(newarr.indexOf(arr[i]) == -1){ newarr.push(arr[i]); } } return newarr; }
方法三 运行indexOf()判断每个值第一次出现的位置和当前i的值是否相等
function norepeat(arr){ var newarr = [arr[0]]; //默认加入第一个数 因为第一个数没比较的必要 for(var i =1;i<arr.length;i++){ if(arr.indexOf(arr[i])==i){ newarr.push(arr[i]) } } return newarr; }
方法四:利用对象的属性唯一 (速度快,占空间多,用空间来换时间)
var res = []; var obj = {}; for(var i=0; i<arr.length; i++){ if( !obj[arr[i]] ){ obj[arr[i]] = 1; res.push(arr[i]); }}
方法五:先利用sort排序再比较相邻的是否相等,相等则删除
function norepeat(arr) { arr.sort(function (a, b) { return a - b; }); for (var i = 0; i < arr.length; i++) { if (arr[i] == arr[i + 1]) { arr.splice(i, 1); i--; } } return arr; }
方法六:运用splice()方法和双层for循环(有点类似选择排序)
function norepeat(arr){ for(var i = 0;i < arr.length-1;i++){ for(var j = i+1;j<arr.length;j++){ if(arr[i] == arr[j]){ arr.splice(j,1); j--; } } } return arr; }
注意:不加 j-- 则会删除后,跳过一个数字
方法六第二种写法 效率低,会增加大量无用的循环比较
function norepeat(arr){ var newArr = arr; for(var i = newArr.length;i > 0 ; i--){ for(var j = 0; j<i ; j++){ if(newArr[i] == newArr[j]){ newArr.splice(i,1); } } } return arr; }
方法七:利用数组下标不能重复,先将参数里的值转化成一个数组的下标,再将下标重新转化成值(非常棒的思路)
function norepeat(arr){ var newArr = []; var arrs = []; for(var i=0;i<arr.length;i++){ var a = arr[i]; newArr[a] = 1; } for(var i in newArr){ arrs[arrs.length] = i; console.log(i); } }
方法八:先排序再用递归进行比较删除
function Digui(arr) { // 获取长度 var 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 arr = [6, 1, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1, 4, 15]; function norepeat(arr) { var arrcopy = []; for (var i = 0; i < arr.length; i++) { var count = 0; for (var j in arrcopy) { if (arrcopy[j] != arr[i]) { count++; } } console.log(arrcopy); if (count == arrcopy.length) { arrcopy[arrcopy.length] = arr[i]; } } return arrcopy; }
//觉得这篇文章有用的 帮我点点赞啊,一个赞你买不了吃亏你买不了上当,你啥也买不了
语雀链接🔗 https://www.yuque.com/suihangadam
归来卧占楼千尺,梦落沧波明月舟。