JavaScript中 数组去重的一些方法
-
for循环(两次嵌套) + 新数组
function deduplication(arr) { var flag = 0; // 创建一个新数组 var result = new Array(); // 遍历原数组 for(var i = 0; i < arr.length; i++) { flag = 0; for(var j = 0; j < arr.length; j++) { // 判断数组内是否已经存在当前元素 if(result[j] == arr[i]) { // 相同值跳过 flag = 1; break; } } // 不同值push进新数组 if(flag == 0) result.push(arr[i]); } // 返回新数组 return result; }
新建一个空数组,for循环遍历原数组,判断数组内是否已存在当前元素,如有相同的值则跳过,不同的推入新数组中,直至原数组遍历完,返回新数组,涉及到多次遍历,执行时间较长;
-
for循环(两次嵌套) + splice
function deduplication(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; }
双层循环,外层循环元素,内层循环时比较值,值相同时,删除这个值;
-
for循环(一次) + indexOf() + 新数组
function deduplication(arr) { // 创建新数组 var result = new Array(); for (var i = 0; i < arr.length; i++) { // 判断新数组中是否存在当前遍历元素 if (result.indexOf(arr[i]) == -1) // 不存在则push到新数组中 result.push(arr[i]); } // 返回新数组 return result; }
对新数组判定是否有该字符,调用 Array.prototype.indexOf 函数,执行时间相对于 方法1 缩减了很多;
-
sort方法
function deduplication(arr) { // 数组排序 arr = arr.sort() var result = [arr[0]]; for (var i = 1; i < arr.length; i++) { // 相邻元素比较 if (arr[i] !== arr[i - 1]) { // 相邻元素不相等push进数组 result.push(arr[i]); } } // 返回新数组 return result; }
利用
sort()
排序方法,然后根据排序后的结果进行遍历及相邻元素对比; -
利用Map去重
function deduplication(arr) { let map = new Map(); let result = new Array(); for (let i = 0; i < arr.length; i++) { // 如果有该key值 if (map.has(arr[i])) { map.set(arr[i], true); } else { // 如果没有该key值 map.set(arr[i], false); result.push(arr[i]); } } // 返回新数组 return result; }
利用 ES6 中的
Map
集合替代前面方法中的新数组,调用Map.has
替代indexOf()
,Map.set
替代push()
,执行速度比前面的方法都要快; -
new Set() + Array.from()
function deduplication(arr) { return Array.from(new Set(arr)); }
利用 ES6 中的
Set
集合,Set
集合是一种无重复元素的列表,new Set(arr)
会自动剔除重复元素,Array.from(...)
将 Set 集合转换为数组; -
new Set() + …(展开运算符)
function deduplication(arr) { return [...(new Set(arr))]; }
思路与方法6一致,只是将
Set
集合转换为数组的实现方法从Array.from(...)
改成了...(展开运算符)
; -
for循环(一次) + 新对象
function deduplication(arr) { let obj = {}; for (let i = 0; i < arr.length; i++) { if (!obj[arr[i]]) { obj[arr[i]] = 1; } } return Object.keys(obj);; }
将创建一个新数组,改成创建一个新对象,判定对象的 key 值,存在跳过,不存在则将字符以对象的 key 值存储, 这种方法也是所有方法中执行时间最短的;