去重
去重是开发中经常碰到的一个问题。
目前经常是后台接口处使用SQL去重,简单高效,
但是去重依旧是前端开发人员必须掌握的技能哈。
数组去重常用的方法
1.双循环去重
双重for(while)循环是一个简单但比较笨重的方法;
原理:
a.先定义一个包含原始数组第一个元素的新数组;
b.然后遍历原始数组,将原始数组中每个元素和新数组中每个元素进行对比;
c.如果不相同,则添加到新数组中,最后返回新的数组;
d.该方法时间复杂度为O(n^2), 如果数组长度很大,则非常耗费内存。
代码:
function unique(arr) {
if (Object.prototype.toString.call(arr) !== "[object Array]") {
throw new Error('类型错误');
return;
}
let res = [arr[0]];
for (let i = 1; i < arr.length; i++) {
let flag = true;
for (let j = 0; j < res.length; j++) {
if (arr[i] === res[j]) {
flag = false;
break;
}
}
if (flag) {
res.push(arr[i]);
}
}
return res;
}
2.indexOf 去重
原理:
a.数组的indexOf方法可以返回指定元素在数组中首次出现的位置;
b.定义一个空数组;
c.对原来数组进行遍历;
d.调用indexOf方法进行判断,元素是否出现在新数组中。
代码:
function unique(arr) {
if (Object.prototype.toString.call(arr) !== '[object Array]') {
throw new Error('类型错误');
return;
}
let res = [];
for (let i = 0; i < arr.length; i++) {
if (res.indexOf(arr[i]) === -1) {
res.push(arr[i]);
}
}
return res;
}
3.indexOf()去重
原理:
a.利用indexOf方法检测元素在数组中第一次出现的位置和元素现在的位置是否相等;
b.如果不想等,则说明是重复元素
代码:
function unique(arr) {
if (Object.prototype.toString.call(arr) !== '[object Array]') {
throw new Error('类型错误');
return;
}
return Array.prototype.filter.call(arr, function (item, index) {
return arr.indexOf(item) === index;
})
}
4.利用对象属性去重
原理:
a.创建空对象;
b.遍历数组;
c.将数组中的值设为对象的属性,并给该属性初始化值1;
d.每出现一次,对应的属性值+1,属性值则为该元素出现的次数;
代码:
function unique(arr) {
if (Object.prototype.toString.call(arr) !== '[object Array]') {
throw new Error('类型错误');
return;
}
let res = [], obj = {};
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
// 如果对象中不存在,则赋值
obj[arr[i]] = 1;
res.push(arr[i]);
} else {
obj[arr[i]]++;
}
}
return res;
}
网友评论