数组去重
Table of Contents
题目描述
设计一个uniquity函数,可以根据用户自定义的重复判定规则进行数组元素去重,举个例子:
//情况一:
let arr0 = [1,1,1,0,5,6];
uniqueify(arr0);
//输出:[1,0,5,6]
//情况二:
let arr1 = [
{id: 1, name: "xx"},
{id: 1, name: "xx"},
{id: 2, name: "xx"},
{id: 1, name: "xx"},
{id: 1, name: "xx"},
];
uniqueify(arr1, a=>a.id); //假如这里的去重规则依据为id
//输出
[
{id: 1, name: "xx"},
{id: 2, name: "xx"},
];
//情况三
let arr2 = [
{name: 'xx', sex: 'male'},
{name: 'xx', sex: 'female'},
{name: 'xx', sex: 'male'},
{name: 'aa', sex: 'male'},
{name: 'aa', sex: 'male'},
]
uniqueify(arr2, a=>(a.name+a.sex));//如这里的去重规则依据为名字和性别均相同,才算是相同
//输出
[
{name: 'xx', sex: 'male'},
{name: 'xx', sex: 'female'},
{name: 'aa', sex: 'male'},
];
最佳解决方案
利用了对象属性不会重复的特点,我认为这里还可以进行优化,比如如何在原数组上进行去重复操作,以优化空间复杂度。
function uniqueify(arr, callback){
var obj = {}
var result = []
for(var a of arr){
key = callback ? callback(a): a
if(!obj[key]){
result.push(a);
obj[key] = 1;
}
}
return result;
}
下面的代码非针对于这道题目
最简洁的代码
[...new Set(1, 1,1,1,1)];
使用filter实现
[1,1,1,1,1,1,1].filter(function(ele,index,array){
return index===array.indexOf(ele);
});