数组去重

229 阅读2分钟

实现一个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;
 		 }