题目大概意思:给定两个维度不确定的数组,求它们之间不重复的数据合集, 返回一个新数组 (备:在当时的题目,并没有说明数组中数据的准确类型,本次采用了字符串和数值混合的数据来测试) 如给定: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]