題目大概意思:給定兩個維度不確定的數組,求它們之間不重複的數據合集,返回一個新數組
(備:在當時的題目,並沒有說明數組中數據的準確類型,本次採用了字符串和數值混合的數據來測試)
如給定:
arr1 = [11, 25, 44, [52, 44, 23], '52']
arr2 = [16, 25, 17, [11, 25, [23, 18]]]
返回:[52, "52", 16, 17, 18]
本次需要考慮的問題:
1、數組降維
因爲數組的維度是不確定的,我們需要做的是把兩個數組都轉換成一維數組。
在ES6中,提供了這麼一個方法
Array.prototype.flat()
在數組的層次不確定時,可以使用Infinity關鍵字作爲參數,即:
Array.prototype.flat(Infinity)
2、使用對象來判斷數據出現的次數
本次需要的數據是:兩個數組合並後只出現一次的數據,這裏我想到的是採用對象的鍵值對方法,但是由於普通對象的鍵是字符串類型,對於數組中同時出現字符串和數值類型則無法判斷,所以我採用Map集合來存儲數據,Map集合是ES6提供的一個完整的hash結構,鍵可以是任意類型
代碼如下:
function fn(arr1, arr2){
let map = new Map();
let res = [];
let arr = arr1.flat(Infinity).concat(arr2.flat(Infinity));
arr.forEach(ele => {
map.has(ele) ? map.set(ele, -1) : map.set(ele, 1)
});
for(let [key, val] of map.entries()){
if(val === 1){
res.push(key);
}
}
return res;
}
測試代碼:
let arr1 = [11, 25, 44, [52, 44, 23], '52'];
let arr2 = [16, 25, 17, [11, 25, [23, 18]]];
console.log(fn(arr1, arr2));
結果:
[52, "52", 16, 17, 18]