实现一个uniq函数,实现数组的简单去重
uniq([1,2,3,5,3,2]); //[1,2,3,5]
法1: 利用ES6新增数据类型 Set
Set类似于数组,但是成员的值都是唯一的,不存在重复的值
function uniq(arr){
return [...new Set(arr)];
}
法2:利用indexOf
function uniq(arr){
let res = [];
for(let i = 0,len=arr.length; i < len; i++){
res.indexOf(arr[i]) === -1 && res.push(arr[i])
}
return res
}
法3:利用includes
function uniq(arr){
let res = [];
for(let i = 0,len=arr.length; i < len; i++){
!res.includes(arr[i]) && res.push(arr[i])
}
return res
}
法4:利用reduce
function uniq(arr){
return arr.reduce((prev,cur)=> prev.includes(cur) ? prev : [...prev,cur],[])
}
法5 利用ES6 Map数据结构
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。 为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适
function uniq(arr){
let mapData = new Map(),
res=[];
arr.map((item)=>{
if(!mapData.has(item)){
mapData.set(item,1);
res.push(item);
}
})
return res;
}
面试题1
数组对象去重 id不重复
let person = [
{id: 0, food: "生蚝"},
{id: 1, food: "湾仔码头"},
{id: 2, food: "大虾"},
{id: 3, food: "螃蟹"},
{id: 1, food: "鱼"},
{id: 2, food: "肉"},
];
function uniq1(arr){
let mapData = new Map(),
res=[];
arr.map((item)=>{
if(!mapData.has(item.id)){
mapData.set(item.id,1);
res.push(item);
}
})
return res;
}
题2
将以上person对象转化成 即合并相同id的name值
[
{id:0,name:'生蚝'},
{id:1,name:['湾仔码头','鱼']},
{id:2,name:['大虾','肉']},
{id:3,name:'螃蟹'},
]
function uniq1(arr){
let mapData = new Map(),
res=[];
arr.map((item,index)=>{
if(mapData.has(item.id)){
let key = mapData.get(item.id);
res[key].name.push(item.name)
}else{
mapData.set(item.id,index)
res.push({
id : item.id,
name:[item.name],
})
}
})
return res;
}