发表于: 2019-12-23 20:10:28
1 1116
数组去重
方案一
/*
* 方案一:德路的方案
* 循环原有数组中的每一项,每拿到一项都往新数组中添加
* 添加之前验证新数组中是否存在这一项,不存在再增加
*/
let newAry = [];
for (let i = 0; i < ary.length; i++) {
// 循环获取原有数组中的每一项
let item = ary[i];
// 验证新数组中是否存在这一项
if (newAry.includes(item)) {
// 存在这一项,不在增加到新数组中,继续下一轮循环即可
continue;
}
// 新数组中不存在这一项,我们加入到新数组中即可
newAry.push(item);
}
console.log(newAry);
//简化代码
let newAry = [];
ary.forEach(item => {
if (newAry.includes(item)) return;
newAry.push(item);
});
console.log(newAry);
方案二
/*
* 方案二:旭东的思路
* 先分别拿出数组中的每一项A
* 用这一项A和“它后面的每项”依次进行比较,如果遇到和当前项A相同的,则在原来数组中把这一项移除掉
*
* 不用includes/indexOf(这样保证兼容性)
*/
var ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3];
for (var i = 0; i < ary.length; i++) {
// item:每一次循环拿出来的当前项
// i:当前项的索引 i+1:代表后一项
var item = ary[i];
// 让当前项和后面的每一项进行比较(循环)
for (var j = i + 1; j < ary.length; j++) {
// compare:后面拿出来要比较的每一项
var compare = ary[j];
// 如果compare和item相等,说明这一项是重复的,我们把它删掉
if (compare === item) {
// j索引这一项要从数组中移除
ary.splice(j, 1);
// 数组塌陷了:j后面的每一项索引都提前了一位,下一次要比较的应该还是j这个索引的内容
j--;
}
}
}
console.log(ary);
方案三
let ary = [1, 2, 3, 1, 2, 1, 2, 3, 2, 1, 2, 3];
// 1.创建一个空对象
let obj = {};
// 2.循环数组中的每一项,把每一项向对象中进行存储 => item:item
for (let i = 0; i < ary.length; i++) {
let item = ary[i];
// 3.每一次存储之前进行判断:验证obj中是否存在这一项
if (obj[item] !== undefined) {
// 已经存在这一项
ary.splice(i, 1);
i--;
continue;
}
obj[item] = item;
}
console.log(ary);
基于splice实现删除性能不好:当前项被删后,后面每一项的索引都要向前提一位,如果后面内容过多,一定影响性能
/*
* unique:实现数组去重的方法
* @params
* ary [Array] 要去重的数组
* @return
* [Array] 去重后的数组
* by zhouxiaotian on 20190724
*/
function unique(ary) {
let obj = {};
for (let i = 0; i < ary.length; i++) {
let item = ary[i];
if (obj[item] !== undefined) {
ary[i] = ary[ary.length - 1];
ary.length--;
i--;
continue;
}
obj[item] = item;
}
return ary;
}
let aa = [12, 23, 12, 15, 25, 23, 25, 14, 16];
aa = unique(aa);
aa.sort((a, b) => a - b);
console.log(aa); //=>[12, 14, 15, 16, 23, 25]
评论