- 利用数组的indexOf方法:新建一个空数组,遍历原数组,如果当前元素在新数组中不存在,则将其加入新数组。
代码示例:
function unique1(arr) { var result = []; // 新建一个空数组 for (var i = 0; i < arr.length; i++) { // 遍历原数组 if (result.indexOf(arr[i]) === -1) { // 如果当前元素在新数组中不存在 result.push(arr[i]); // 将其加入新数组 } } return result; // 返回新数组 }
- 利用对象的属性名不能重复:新建一个空对象和一个空数组,遍历原数组,如果当前元素在对象中不存在,则将其作为对象的属性名和属性值存入对象,并将其加入新数组。
代码示例:
function unique2(arr) { var obj = {}; // 新建一个空对象 var result = []; // 新建一个空数组 for (var i = 0; i < arr.length; i++) { // 遍历原数组 if (!obj[arr[i]]) { // 如果当前元素在对象中不存在(注意:0和false也会被判断为不存在) obj[arr[i]] = true; // 将其作为对象的属性名和属性值存入对象(属性值可以是任意值) result.push(arr[i]); // 将其加入新数组 } } return result; // 返回新数组 }
- 利用ES6的Set数据结构:Set是一种类似于数组但不包含重复元素的集合,可以直接将原数组转换为Set,然后再转换回数组。
代码示例:
function unique3(arr) { return [...new Set(arr)]; // 直接将原数组转换为Set,然后再转换回数组(利用扩展运算符...) }
- 利用ES6的Map数据结构:Map是一种存储键值对的集合,可以利用键名不能重复的特性来去重。新建一个空Map和一个空数组,遍历原数组,如果当前元素在Map中不存在,则将其作为键名和键值存入Map,并将其加入新数组。
代码示例:
function unique4(arr) { var map = new Map(); // 新建一个空Map var result = []; // 新建一个空数组 for (var i = 0; i < arr.length; i++) { // 遍历原数组 if (!map.has(arr[i])) { // 如果当前元素在Map中不存在(注意:0和false也会被判断为不存在) map.set(arr[i], true); // 将其作为键名和键值存入Map(键值可以是任意值) result.push(arr[i]); // 将其加入新数组 } } return result; // 返回新数组 }
- 利用排序后相邻去重:先对原数组进行排序(sort方法),然后新建一个空数组,遍历排序后的原数组,如果当前元素与上一个元素不同,则将其加入新数组。
代码示例:
function unique5(arr) { arr.sort(); // 先对原数组进行排序(sort方法) var result=[arr[0]]; // 新建一个空数组,将排序后的第一个元素放入其中 for(var i=1;i<arr.length;i++){ // 遍历排序后的原数组,从第二个元素开始 if( arr[i] !== arr[i-1]){ // 如果当前元素与上一个元素不同 result.push(arr[i]); // 将其加入新数组 } } return result; }
- 利用filter方法:filter方法可以根据指定的条件过滤出符合要求的元素。利用该方法可以过滤出原始索引等于当前索引(indexOf方法)或最后索引(lastIndexOf方法)的元素。
代码示例:
function unique6_1(arr) { return arr.filter(function(item,index,arr){ // filter方法可以根据指定的条件过滤出符合要求的元素 return arr.indexOf(item) === index; // 过滤出原始索引等于当前索引的元素,即去除重复项 }) } function unique6_2(arr){ return arr.filter(function(item,index,arr){ return arr.lastIndexOf(item) === index; // 过滤出最后索引等于当前索引的元素,即去除重复项 }) }
- 利用reduce方法:reduce方法可以对累积器和当前值应用一个函数,并返回累积器。利用该方法可以判断累积器(即结果数组)中是否已经包含当前值,并根据条件返回结果。
代码示例:
function unique7_1(arr){ return arr.reduce((prev,cur)=>prev.includes(cur)?prev:[...prev,cur],[]); // reduce方法可以对累积器和当前值应用一个函数,并返回累积器。利用该方法可以判断累积器(即结果数组)中是否已经包含当前值,并根据条件返回结果。 } function unique7_2(array){ return array.reduce((p,c)=>p.includes(c)?p:p.concat(c),[]); }
如果还有别的方法去重,欢迎评论交流!