前言
const arr = [1, 1, '1', 11, true, false, false, 'true', 'a', {}, {}];
// 写一个unique方法实现去重
//unique(arr) => [1, '1', 11, true, false, 'true', 'a', {}, {}]
一、利用set去重
使用ES6提供的数据结构Set,代码简洁,但注意有兼容性问题
function unique (arr) {
return Array.from(new Set(arr))
}
二、双层for循环+splice
思路:遍历数组拿当前项与后边所有项对比,若相同删除重复项
function unique (arr) {
let len = arr.length;
for (let i = 0; i < len; i++) {
for (let j = i + 1; j < len; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
len--;
j--;
}
}
}
return arr;
}
三、利用indexOf去重
使用indexOf方法有两种思路实现去重。
思路一: 遍历数组判断新数组中有没有当前项,没有放入新数组
function unique (arr) {
const res = [];
for (let i = 0; i < arr.length; i++) {
if (res.indexOf(arr[i]) === -1) res.push(arr[i]);
}
return res;
}
思路二: 将第一项放进新数组,从第二项开始遍历,若当前项元素在数组第一次出现的位置不等于当前的位置,则代表此元素前边已经存在,忽略掉,否则放进新数组。
function unique (arr) {
const res = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr.indexOf(arr[i]) === i) res.push(arr[i]);
}
return res;
}
四、使用includes
其实这种方法和上边indexOf方法思路大同小异
includes() 此方法返回一个布尔值,判断给定的值是否存在于数组中,和字符串的includes方法基本类似
function unique (arr) {
const res = [];
for (let i = 0; i < arr.length; i++) {
if (!res.includes(arr[i])) res.push(arr[i]);
}
return res;
}
五、sort() 方法去重
思路:先排序,相邻两项比较,若不相同放新数组,否则忽略
function unique (arr) {
arr.sort() // 注意细节,sort()方法没有返回值,会改变可变对象
const res = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i-1]) res.push(arr[i]);
}
return res;
}
六、利用hasOwnProperty()
hasOwnProperty() 方法:返回一个布尔值,表示对象自身属性中是否具有指定的属性。
思路:利用对象的键名不可重复的特点。
function unique (arr) {
let obj = {};
return arr.filter(function(item, index, arr){
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
七、利用hash表
思路:也是利用对象的键名不可重复的特点。
function unique (arr) {
var n = {},res=[]; //n为hash表,res为临时数组
for(var i = 0; i < arr.length; i++){
if (!n[arr[i]]){
n[arr[i]] = true;
res.push(arr[i]);
}
}
return res;
}
八、使用Map
思路:创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中,和上边hash的思路基本一致。
function unique (arr) {
let map = new Map();
let res= [];
for (let i = 0; i < arr.length; i++) {
if (!map.has(arr[i])){
map.set(arr[i], false);
res.push(arr[i]);
}
}
return res;
}
大概就想到了这么多,希望可以帮助到你,欢迎交流补充,我们共同学习共同进步!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)