数组去重

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);
});