數組去重
var arr = [1, 43, 4, 3, 2, 4, 3]; // 去重后 arr = [1, 43, 4, 3, 2]
傳統方法,for循環實現
//方法一: function dedupe(arr) { var rets = []; for (var i = 0; i < arr.length; i ++) { if (!rets.includes(arr[i])) { rets.push(arr[i]); } } return rets; } // 方法二: forEach方法實現 function dedupe(arr) { var rets = []; arr && arr.forEach(function(item){ if (!rets.includes(item)){ rets.push(item); } }); return rets; }
ES6方法實現
// es6提供的新的數據結構Set,類似數組,但是成員的值都是唯一的,沒有重復的值。 function dedupe(arr) { var newSet = new Set(arr); // arr變成了set的數據結構,並去除了其中重復的元素 return Array.from(newSet); // Array.from方法將set數據結構轉為數組數據結構 }
復雜的數組去重
[1,2,{a:1},3,2,{a:1},[1,2],[1,2]] //數組中的元素包含對象和數組
function unique(arr) { const hash = {}; const res = []; for (let i = 0; i < arr.length; i++) { if (hash[arr[i]] == null) { res.push(arr[i]); hash[arr[i]] = true; } } return res; } unique([1,2,{a:1},3,2,{a:1},[1,2],[1,2]]); // 1, 2, {a: 1}, 3, [1, 2]
數組去扁平化
數組的扁平化,就是將一個嵌套多層的數組array(嵌套可以是任何層數)轉換為只有一層的數組
var arr = [1, 2, 3, [4, 3, [2, 7], 2], 5, [5, 9, 10], 7]; // 去扁平化后 arr = [1, 2, 3, 4, 3, 2, 7, 2, 5, 5, 9, 10, 7];
(1)循環遞歸實現
// for循環,如果子元素還是數組,則遞歸調用該方法 function flatten(arr) { var rets = []; for(var i = 0; i < arr.length; i ++) { if (Array.isArray(arr[i])) { rets = rets.concat(flatten(arr[i])); } else { rets.push(arr[i]); } } return rets; } // 使用forEach function flatten(arr) { var rets = []; arr && arr.forEach(function(item) => { if (Array.isArray(item)) { rets = rets.concat(flatten(item)); } else { rets.push(item); } }); return rets; }
(2)使用reduce簡化代碼
function flatten(arr) { return arr.reduce(function(pre, item){ return pre.concat(Array.isArray(item) ? flatten(item) : item); }, []) }