视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JS数组去除重复数据
2020-11-27 20:01:03 责编:小采
文档


在JS中经常会遇到去除数组中重复数据的需求,在此介绍四种算法以实现JS数组去重的功能,希望能帮助到大家。

1.速度最快算法:对象键值对法

实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。

//注意点: 判断 是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。
 //速度最快, 占空间最多(空间换时间)
 function unique(array){
 var n = {}, r = [], len = array.length, val, type;
 for (var i = 0; i < array.length; i++) { val = array[i]; type = typeof val; if (!n[val]) {
 n[val] = [type];
 r.push(val);
 } else if (n[val].indexOf(type) < 0) {
 n[val].push(type);
 r.push(val);
 }
 } return r;
 }

2.最巧妙算法:优化遍历数组法

实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)

function unique1(array){
 var r = []; for(var i = 0, l = array.length; i<l; i++){ for(var j = i + 1; j < l; j++) if(array[i] == array[j]) j == ++i;
 r.push(array[i]);
 } return r;
 }

3.算法:排序后相邻去除法

实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

//将相同的值相邻,然后遍历去除重复值
 function unique2(array){
 array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1])
 {
 re.push(array[i]);
 }
 } return re;
 }

4.算法:数组下标判断法

实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组

function unique3(array){
 var n = [array[0]]; //结果数组
 //从第二项开始遍历
 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
 //那么表示第i项是重复的,忽略掉。否则存入结果数组
 if (array.indexOf(array[i]) == i) n.push(array[i]);
 } return n;
 }

在JS中经常会遇到去除数组中重复数据的需求,在此介绍四种算法以实现JS数组去重的功能.

1.速度最快算法:对象键值对法

实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。

//注意点: 判断 是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调用“indexOf”。
 //速度最快, 占空间最多(空间换时间)
 function unique(array){
 var n = {}, r = [], len = array.length, val, type;
 for (var i = 0; i < array.length; i++) { val = array[i]; type = typeof val; if (!n[val]) {
 n[val] = [type];
 r.push(val);
 } else if (n[val].indexOf(type) < 0) {
 n[val].push(type);
 r.push(val);
 }
 } return r;
 }

2.最巧妙算法:优化遍历数组法

实现思路:获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)

function unique1(array){
 var r = []; for(var i = 0, l = array.length; i<l; i++){ for(var j = i + 1; j < l; j++) if(array[i] == array[j]) j == ++i;
 r.push(array[i]);
 } return r;
 }

3.算法:排序后相邻去除法

实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

//将相同的值相邻,然后遍历去除重复值
 function unique2(array){
 array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1])
 {
 re.push(array[i]);
 }
 } return re;
 }

4.算法:数组下标判断法

实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组

function unique3(array){
 var n = [array[0]]; //结果数组
 //从第二项开始遍历
 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
 //那么表示第i项是重复的,忽略掉。否则存入结果数组
 if (array.indexOf(array[i]) == i) n.push(array[i]);
 } return n;
 }

下载本文
显示全文
专题