js中常见的去重方式
/* * 几种常用的去重的方式 */ var arr = [2, 6, 1, 15, 11, 7, 12, 8, 5, 4, 3, 12, 10, 1, 7, 2, 4, 4, '4', 12, false, false, 3, '3']; // 去重方法1 : 先将数组排序,然后循环数组,判断当前元素与上一个是否相当,只针对number var unique1 = function(arr) { var removeArr = []; arr = arr.sort((function(a, b){ return a - b;})); for (var i=1; i<arr.length;i++) { if (arr[i] === arr[i-1] ) { arr.splice(i--,1); } } return arr; }; // 去重方法2:排序后,利用新数组内.push的元素比较2个值是否相等。只针对number var unique2 = function(arr) { arr = arr.sort(function(a, b){return a - b;}); var result = [arr[0]], len = arr.length, i; // 每次与新增到result中的值对比 for(i = 1; i < len; i++) { if(arr[i] !== result[result.length - 1]) { result.push(arr[i]); } } return result; }; // 去重方法3:利用对象中是否有一样的属性进行比较。可区分string和number var unique3 = function(arr) { var result = [], o = {}, len = arr.length, i; for(i = 0; i < len; i++) { if(!o[arr[i]]) { result.push(arr[i]); o[arr[i]] = true; } } return result; }; // 去重方法4:类似于插入排序~不过是从前向后找。只针对number类型 var unique4 = function(arr) { var i, j; for(i = 0; i < arr.length; i++) { j = i + 1; // 相邻比较 while(j < arr.length){ if(arr[i] === arr[j]) { arr.splice(j, 1); j--; // 删除后,当前索引值则会是自动补进下一位元素,因此要--,否则会跳过自动补进的元素 } j++; // 向后查找 } } return arr.sort(function(a,b){return a - b;}); }; // 去重方法5:跳出循环 向后查找比较当前i的值 var unique5 = function(arr) { var result = [], len = arr.length, i, j; for(i = 0; i < len; i++) { for(j = i + 1; j < len; j++) { if(arr[i] === arr[j]) { // 如果有相同的j重新赋值false并跳出loop j = false; break; } } if(j) { // j为false时,当前i的值不计入新数组内,直到是唯一的才会被push进去。 result.push(arr[i]); } } return result.sort(function(a, b){return a - b;}); }; // 去重方法6:向后查找,如果值相等,则跳出本次循环,进行下次循环 var unique6 = function(arr) { var result = [], len = arr.length, i, j; for(i = 0; i < len; i++) { j = i + 1; while(j < len){ if(arr[i] === arr[j]){ j = ++i; // 跳出本次循环 } j++; } result.push(arr[i]); } return result.sort(function(a, b){return a - b;}); }; // console.log(unique1(arr)); // console.log(unique2(arr)); // console.log(unique3(arr)); // console.log(unique4(arr)); // console.log(unique5(arr)); console.log(unique6(arr));