准备测试代码:
const arr1 = Array.from (new Array (100000), (item, index) => { return index; }); const arr2 = Array.from (new Array (50000), (item, index) => { return index * 2; }); console.log ('开始测试'); const start = new Date().getTime(); distinct(arr1, arr2); // 去重方法 const end = new Date ().getTime (); console.log ('测试结束'); console.log ('测试时间' + (end - start) / 1000 + 's');
一:filter + indexOf
function distinct(arr1, arr2) { console.log('filter + indexOf'); const arr = [...arr1, ...arr2]; return arr.filter((item, index) => { return arr.indexOf(item) === index; }); }
效果:时间11s
二:双重循环,删除(splice)重复项
function distinct(a, b) {
console.log('双重for循环');
const arr = a.concat(b); for (let i = 0, len = arr.length; i < len; i++) { for (let j = i + 1; j < len; j++) { if (arr[i] == arr[j]) { arr.splice(j, 1); // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一 len--; j--; } } } return arr }
效果:22s
三、includes + push
function distinct(arr1, arr2) { console.log('includes + push新数组'); const arr = [...arr1, ...arr2]; const result = []; for (item of arr) { !result.includes(item) && result.push(item); } return result; }
效果:11s
四、先排序(sort),然后比较临近2个
function distinct(arr1, arr2) { console.log('先排序, 比较临近的2个 然后push'); let arr = [...arr1, ...arr2]; arr = arr.sort((a, b) => {return a - b}); const result = []; for (let i = 0, len = arr.length; i < len; i++) { (arr[i] !== arr[i + 1]) && result.push(arr[i]); } return result; }
效果:0.03s
四、使用set
function distinct(arr1, arr2) { console.log('使用set'); const arr = [...arr1, ...arr2]; return Array.from(new Set(arr)); }
效果:0.04s
五、 for循环配合对象使用,然后push
function distinct(arr1, arr2) { console.log('for循环配合对象使用,然后push'); const arr = [...arr1, ...arr2]; const len = arr.length; const obj = {}; const result = []; for (let i = 0; i < len; i++){ if (!obj[i]) { result.push(arr[i]); obj[i] = 1; } } return result; }
效果:0.03s
六、reduce
function distinct(arr1, arr2) { console.log('reduce'); const arr = [...arr1, ...arr2]; arr.reduce((prev, cur) => { if (!prev.includes(cur)) { return [...prev, cur]; } else { return prev; } }, []); }
效果:110s