js陣列去重與去扁平化
阿新 • • 發佈:2018-11-03
陣列去重
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);
}, [])
}
(3)如果陣列元素都為數字,則可以使用toString方法
function flatten(arr) {
var newArr = arr.toString().split(',');
return newArr.map(function(item){
return +item; // 將字串轉為數字
});
}