前段时间在做需求的时候,用到了一个需要深度去重的方法,考虑到性能和兼容性,将自己的两种思路整合下来,分享一下。
先把工具函数扔出来
function getType (obj) {
var toString = Object.prototype.toString;
var map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object'
};
if (obj instanceof Element) {
return 'element';
}
return map[toString.call(obj)];
}
/**
* @method 数组去重
* @param {Array} arr 传入的原数组
* @param {Bollean} deep 是否为深度去重
* @param {undefined} recursiveArr 调用者不传,递归使用
*/
function deleteRepeat (arr, deep = false, recursiveArr) {
if(!recursiveArr) {
try {
if(deep) return [...new Set(arr.flat(Infinity))] // es10
return [...new Set(arr)] // es6
}
catch(e) {
console.log('浏览器不支持es10,使用兼容写法')
}
}
// 兼容写法
let tempArr;
if(recursiveArr) {
tempArr = recursiveArr;
} else {
tempArr = [];
}
for(let i = 0, length = arr.length; i < length; i++) {
let type = getType(arr[i])
if(type === 'number' || type === 'boolean' || type === 'string'|| type === 'undefined'|| type === 'null') {
if(tempArr.indexOf(arr[i]) === -1) {
tempArr.push(arr[i]);
}
} else if(type == 'array') {
if(deep) {
this.deleteRepeat(arr[i], true, tempArr);
} else {
tempArr.push(arr[i]);
}
} else {
tempArr.push(arr[i]);
}
}
return tempArr;
}
console.log(
deleteRepeat([1,[1,2,3],[1],[4,[1]],1,2,2,[[[[8]]]]],true),
deleteRepeat([1,[1,2,3],[1],[4,[1]],1,2,2,[[[[8]]]],[{a: 10}, 1, [{b:11}], {a: 12}], {a: 10, b: 12, c: [1,2,3]}],true)
)