数组去重
2019-07-05 本文已影响0人
没了提心吊胆的稗子
var ary = [1,2,3,4,5,6,3,2,1,4,6,3,5,8,4,2,2,8,3,9,5,8,7];
数组去重
1、双重遍历
每一次用当前项跟后面所有项比较,有相等的记录,就是重复项。外层循环ary.length-1次,因为最后一项后面没有了,性能不好
需要解决数组塌陷问题,有两种办法
// 方案一 双重遍历
for (let i = 0; i < ary.length -1 ; i++) {
var cur = ary[i];
// 拿出这一项和后面的每一项比
for(let j = i + 1; j < ary.length; j ++){
if(cur === ary[j]){
// 若相等,删除当前项 会出现数组塌陷 当前项后面的索引都要向前提一位
ary.splice(j, 1);
j --;
}
}
}
var ary = [1,2,3,4,5,6,3,2,1,4,6,3,5,8,4,2,2,8,3,9,5,8,7];
// 方案一 双重遍历
for (let i = 0; i < ary.length -1 ; i++) {
var cur = ary[i];
// 拿出这一项和后面的每一项比
for(let j = i + 1; j < ary.length;){
// 删除的时候不加,不删的时候再加
cur === ary[j] ? ary.splice(j,1) : j ++;
}
}
2、indexOf实现
数组中有就删除当前项(不兼容IE6-8) 一次循环实现
for (let i = 0; i < ary.length; i++) {
var cur = ary[i]; // 当前项 跟后面元素组成的新数组比较
var curNextAry = ary.slice(i + 1);
if(curNextAry.indexOf(cur) > -1){
ary.splice(i, 1);
i --;
}
}
3、利用对象键值对操作
把当前项作为对象的属性名属性值即 obj[ary[i]] = ary[i],每次存储之前先验证,若已有说明重复,删除当前项
var obj = {};
for (let i = 0; i < ary.length; i++) {
if(typeof obj[ary[i]] === 'undefined'){
obj[ary[i]] = ary[i];
}else{
ary.splice(i,1);
i --;
}
}
以上方法都用splice方法删除,若后面有很多项,消耗会很大,优化删除方法
用最后一项替换需要删除的一项,最后一项删除
var obj = {};
for (let i = 0; i < ary.length; i++) {
if(typeof obj[ary[i]] === 'undefined'){
obj[ary[i]] = ary[i];
}else{
ary[i] = ary[ary.length - 1];
ary.length --;
i --; // 当前循环过了还得再循环一次
}
}
最终版
Array.prototype.myUnique = function () {
var obj = {};
for (let i = 0; i < this.length;) {
if(typeof obj[this[i]] === 'undefined'){
obj[this[i]] = this[i];
i ++;
}else {
this[i] = this[this.length - 1];
this.length --;
}
}
return this;
};
set集合去重
set集合是不重复的一组元素的集合,利用这个特点去重
var newSet = new Set(ary);
console.log(Array.from(newSet));
相邻比较法
先排序,再跟相邻元素比较
var newAry = [1,2,3,5,2,3,6].sort(function (a,b) {
return a - b;
});
for (let i = 0; i < newAry.length; i++) {
if(newAry[i] === newAry[i+1]){
newAry.splice(i+1, 1);
i --;
}
}