数组去重和深度去重

1,617 阅读1分钟

前段时间在做需求的时候,用到了一个需要深度去重的方法,考虑到性能和兼容性,将自己的两种思路整合下来,分享一下。

先把工具函数扔出来
  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)
)