数组去重-基于对象键值对方式处理

169 阅读1分钟
var ary = [1,2,3,2,2,3,4,3,4,5];
/*
* 第一次循环 1 {1:1}
* 第二次循环 2 {1:1,2:2}
* 第三次循环 3 {1:1,2:2,3:3}
* 第四次循环 2 我们在存储之前做一个判断,判断当前对象中是否已经存在这个属性名了,如果存在,说明之前有这一项存储得操作,进一步说明之前数组中出现过这个数值了(也就是重复了,此时我们把当前项在数组中移除即可)
* ...
*/
var obj = {};
for (var i = 0; i < ary.length; i++) {
	var item = ary[i];//=>每一次循环从数组中拿出来的这一项
	 
	//=>存储之前需要做判断:如果对象中已经存在这个属性了,说明当前ITEM在之前出现过,也就是当前项重复了,我们把当前项删掉
	if (typeof obj[item] !== 'undefined') {
		/* ary.splice(i, 1);
		 * i--;//=>防止数组塌陷
		 * 
		 * 这种删除方式不好,如果数组很长,我们删除某一项,后面索引都需要重新计算,非常耗性能
         */
          
         /*
          * 1.我们把数组最后一项的结果获取到,替换当前项内容
          * 2.在把数组最后一项删除
          * [12,23,34,56] 想要删除23
          *     先让56替换23 [12,56,34,56]
          *     在把最后一项删除 [12,56,34]
          */
         ary[i] = ary[ary.length - 1];
         ary.length--;
         i--;
		continue;
	}
	//=>把这一项作为对象的属性名和属性值存储进去
	obj[item] = item;//=>obj[1] => {1:1}
}
console.log(ary);