JavaScript 算法之 数组去重
方法一 ES6 的 Set 数据结构
/*
* 数组去重
* @param {array} ary 需要去重的数组
* @return {array} 去重后的数组
*/
function unique1(ary){
return [...new Set(ary)];
}
方法二 对象的 key 唯一性
/*
* 数组去重
* @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',会被视为同一个值。
方法三 临时数组判断插入
/*
* 数组去重
* @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项是重复的,忽略掉。否则存入结果数组。
/*
* 数组去重
* @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;
}
方法五 排序后逐个比较插入
给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。
/*
* 数组去重
* @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:返回的数组顺序发生了改变。
方法六
获取没有重复的最右一值放入新数组(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)。
/*
* 数组去重
* @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]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 高效的 python 实践总结
下一篇: JavaScript 集合的方法
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论