发表于: 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]




返回列表 返回列表
评论

    分享到