数组去重
/**
*
* @param arr 原始数组
* @param attrs 依据属性 eg. 'a','b' 依据引用数组元素的属性a和b 作为判断依据。
* @returns [*] 去重后的数组
*/
const deDuplication = (arr, ...attrs) => {
if (arr.length === 0) {
return [];
}
let isRefType = arr[0] instanceof Object;
// 基本数据类型
if (!isRefType) {
return arr.filter((_el, _index, _arr) => {
return _arr.indexOf(_el) === _index;
})
}
// 引用类型
if (isRefType) {
return arr.filter((_el, _index, _arr) => {
return _arr.findIndex(item => {
let flag = true;
for (let i = 0; i < attrs.length; i++) {
let attr = attrs[i];
flag = flag && item[attr] === _el[attr];
}
return flag;
}) === _index;
})
}
}
测试:
const arr = [1, 2, 3, 4, 2, 1, 5, 6]
const objArr = [
{"a": 1, "b": 1, "c": 2},
{"a": 1, "b": 1, "c": 2}
]
console.time('t')
//根据属性a和b 确定去重
console.log(deDuplication(objArr, 'a', 'b'));
console.timeEnd('t')
console.log(deDuplication(arr))
运行结果:
这里数组中两个元素的属性a,b的值一样,所以为重复元素。去重结果如下
[ { a: 1, b: 1, c: 2 } ]
t: 6.765ms
[ 1, 2, 3, 4, 5, 6 ]