数组去重
本文参考: JavaScript 高性能数组去重
看完后把代码敲了一编,代码如下:
//构造两个数组,后拼接在一起作为数据源 let arr1 = Array.from(new Array(1000000), (x, index) => { return index; }); let arr2 = Array.from(new Array(500000), (x, index) => { return index + index; }); let start = new Date().getTime(); console.log("开始去重..."); function distinct(a, b, fn) { let preArr = a.concat(b); return fn(preArr); } //以下是多种不同的去重方法,从上至下时间复杂度越来越低 function f_filter(arr) { return arr.filter((e, index) => arr.indexOf(e) === index); } function f_forAndIndexOf(arr) { let newArr = []; for (let i = 0; i < arr.length; i++) { if (newArr.indexOf(arr[i]) === -1) newArr.push(arr[i]); } return newArr; } function f_sortAndFor(arr) { arr.sort(); let newArr = [arr[0]]; for (let i = 1; i < arr.length; i++) { if (arr[i] !== arr[i - 1]) newArr.push(arr[i]); } return newArr; } function f_set(arr) { return Array.from(new Set(arr)); } function f_forOfAndObj(arr) { let obj = {}; let newArr = []; for (let i of arr) { if (obj[i] !== 1) { newArr.push(i); obj[i] = 1; } } return newArr; } //去重、打印耗时 console.log("去重后的长度:", distinct(arr1, arr2, f_set).length); let end = new Date().getTime(); console.log("耗时:", end - start);
从实践来看,几个去重函数从上至下,时间复杂度越来越低,对象的那个简直爆炸,时间贼短,比Set还快!这就是传说中的以空间换时间吧,set的表现也是相当惊人。