javascript算法集:数组去重
数组去重 方法一(ES6的Set数据结构)
1 2 3 4 5 6 7 8 | /* * 数组去重 * @param {array} ary 需要去重的数组 * @return {array} 去重后的数组 */ function unique1(ary){ return [...new Set(ary)]; } |
数组去重 方法二(对象的key唯一性)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * 数组去重 * @param {array} ary 需要去重的数组 * @return {array} 去重后的数组 */ function unique2(ary){ let obj = {}, i = 0, len = ary.length; while(i < len){ if(!obj[ary[i]]){ obj[ary[i]] = true; // 如果不存在 } i++; } return Object.keys(obj); } |
PS:该方法存在一定问题,数组的元素全部被转化为字符串,因为ES6之前对象的key只能是字符串。
会把数字1和字符串’1’,会被视为同一个值。
数组去重 方法三(临时数组判断插入)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | /* * 数组去重 * @param {array} ary 需要去重的数组 * @return {array} 去重后的数组 */ function unique3(ary){ let tem = [], i = 0, len = ary.length; while(i < len){ // tem.indexOf() === -1 同理 !tem.includes(ary[i]) ? tem.push(ary[i]) : ''; i++; } return tem; } |
数组去重 方法四(判断首次出现的位置)
如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* * 数组去重 * @param {array} ary 需要去重的数组 * @return {array} 去重后的数组 */ function unique4(ary){ let tem = [ary[0]], len = ary.length; for(let i = 1; i < len; i++ ){ // 核心,首次的索引出现是否为当前的索引 if(ary.indexOf(ary[i]) === i) tem.push(ary[i]); } return tem; } |
数组去重 方法五(排序后逐个比较插入)
给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /* * 数组去重 * @param {array} array 需要去重的数组 * @return {array} 去重后的数组 */ function unique5(array){ let ary = array.slice(); ary.sort(); let tem = [ary[0]]; for(let i = 0, len = ary.length; i < len; i++){ ary[i] !== tem[tem.length - 1] ? tem.push(ary[i]) : ''; } return tem; } |
PS:返回的数组顺序发生了改变。
数组去重 方法六()
获取没有重复的最右一值放入新数组(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* * 数组去重 * @param {array} ary 需要去重的数组 * @return {array} 去重后的数组 */ function unique6(ary){ let tem = []; for(let i = 0, len = ary.length; i < len; i++){ for(let j = i + 1; j < len; j++){ if(ary[i] === ary[j]) j = ++i; } tem.push(ary[i]) } return tem; } |
测试:unique1([1, 2, 3, 2]) // [1, 2, 3]
THE END






