本文总结了JavaScript去重的多种形式,各有优缺点,依据需要正当应用吧。
- 应用
for
循环和indexOf
办法,复杂度 O(n^2)
function uniqueArray(arr) { const result = [] for (let i = 0; i < arr.length; i++) { if (result.indexOf(arr[i]) === -1) { result.push(arr[i]) } } return result}
- 应用
for
循环和对象,复杂度 O(n^2)
function uniqueArray(arr) { const result = [] const obj = {} for (let i = 0; i < arr.length; i++) { if (!obj[arr[i]]) { result.push(arr[i]) obj[arr[i]] = true } } return result}
- 应用
filter
办法和indexOf
办法,复杂度 O(n^2)
function uniqueArray(arr) { return arr.filter((item, index, arr) => arr.indexOf(item) === index)}
- 应用
filter
办法和对象,复杂度 O(n)
function uniqueArray(arr) { const obj = {} return arr.filter((item) => obj.hasOwnProperty(item) ? false : (obj[item] = true))}
- 应用
Set
数据结构,复杂度 O(n)
function uniqueArray(arr) { return Array.from(new Set(arr))}// 应用解构 + Setfunction uniqueArray(arr) { return [...new Set(arr)]}
- 应用
Map
数据结构,复杂度 O(n)
function uniqueArray(arr) { const map = new Map(); const result = []; for (let i = 0; i < arr.length; i++) { if (!map.has(arr[i])) { map.set(arr[i], true); result.push(arr[i]); } } return result;}// orfunction uniqueArray(arr) { const map = new Map(); return arr.filter(function(item) { return !map.has(item) && map.set(item, true); });}
- 应用双重循环和
splice
办法,复杂度 O(n^2)
function uniqueArray(arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] === arr[j]) { arr.splice(j, 1); j--; } } } return arr;}
- 应用排序和双指针
应用排序和双指针能够实现 O(nlogn) 的工夫复杂度。先对数组进行排序,而后应用双指针遍历数组,如果左指针和右指针指向的值雷同,就把右指针向右挪动,直到找到不同的值,而后把左指针向右挪动,持续遍历。
function uniqueArray(arr) { arr.sort(); var left = 0, right = 1; var result = []; while (right <= arr.length) { if (arr[left] === arr[right]) { right++; } else { result.push(arr[left]); left = right; right++; } } return result;}
- 应用
reduce
办法和includes
,复杂度 O(n^2)
function uniqueArray(arr) { return arr.reduce(function(prev, cur) { if (!prev.includes(cur)) { prev.push(cur); } return prev; }, []);}
- 应用递归和
includes
,复杂度 O(n^2)
function uniqueArray(arr) { if (arr.length === 1) { return arr; } else { const first = arr[0]; const rest = uniqueArray(arr.slice(1)); if (rest.includes(first)) { return rest; } else { return [first].concat(rest); } }}
- 双层循环,复杂度 O(n^2)
function uniqueArray(arr) { var result = []; for (var i = 0; i < arr.length; i++) { for (var j = 0; j < result.length; j++) { if (arr[i] === result[j]) { break; } } if (j === result.length) { result.push(arr[i]); } } return result;}