乐趣区

关于javascript:数组去重方法集锦一

前两天写了一篇去重的办法,尽管都是本人公众号的老文章,被善意的小伙伴问我用的是不是 2G 网。我感觉不论是什么网,总有须要的人,想在网络的浩瀚陆地中找到本人须要的货色,当然是非常高兴。有工夫,有机会把本人晓得的拿进去分享,感觉有须要的天然会有所得,即便被说成“电话拨号”也无所谓。

言归正传,数组去重我分成三个局部 ES3、ES5、ES6,本篇介绍 ES3 中的一个办法。

先创立一个老数组,接着,同样是拿一个空盘子来。空盘子了,什么都不放。

var arr = ['周一', '周二', '周三', '周二', '周一'];
var newAarry = [];

接下来还是循环的看,这次和昨天的不同,昨天的是看老数组和新数组的雷同元素,明天是只看老数组,后面一项和紧挨着它的前面一项是不是反复。那么看两项还是双层 for 循环,不一样的是,内层循环的初始值,是外层循环的 i +1。为什么是 +1,下一项的索引当然是 + 1 啦!

for (var i = 0; i < arr.length; i++) {for (var j = i + 1; j < arr.length; j++){}}

当初循环了,人后怎么办呢?这时候咱们有两个值,一个是 arr[i] 一个是 arr[j],它们的关系是每一个值和它前面元素的关系。那么如果它们两个值一样的话阐明了,有反复。

所以这时候须要一个判断,判断正在比拟的这两个值是不是一样的。于是还是 if 语句。

for (var i = 0; i < arr.length; i++) {for (var j = i + 1; j < arr.length; j++){if (arr[i] === arr[j]) {// 一样就在这里操作}
  }
  // 不一样就给新数组 push
  newAarry.push(arr[i]);
}

难点不在给新数组 push,而在判断内的操作。如果发现雷同了:

1. 我须要“放过”这次循环,不做任何操作,尤其是不 push

2. 此时,循环还在内层于是我将外层的 i 间接变成下一次,也就是 ++ 的操作

var a = 1;
var b = ++a;
var b = a++;

在这里举例,++a 和 a ++ 是不一样的。++ a 是先给 a + 1 之后赋值给 b,而 a ++ 则是先给 b 赋值 a,而后 a 再 ++。

for (var i = 0; i < arr.length; i++) {for (var j = i + 1; j < arr.length; j++){if (arr[i] === arr[j]) {++i;// 改了这里}
  }
  newAarry.push(arr[i]);
}

所以如果发现相等,我马上进行“放过”操作,也就是 ++i。可是咱们都晓得,这个时候还在内层循环中。内层 for 循环的 j 还在循序渐进的运行着,忽然,i 就变了,那么 i + 1 也就跟着变了,j 运行到更新操作 j ++ 的时候一下就会多跳过一个元素没比。

那么我再把 j 拉回来既能够了,可我没方法扭转 for 循环中 j ++ 的更新语句。可我能扭转 j 的值呀!j=i 这时 j 的值就变的和 i 一样了,这时候还在内层 for 循环中的倒数第二步,当我进行完这步之后,马上就要 j ++ 了,就相当于拉回两步近一步,最初 j 还是会和 i 错后一位的。

for (var i = 0; i < arr.length; i++) {for (var j = i + 1; j < arr.length; j++){if (arr[i] === arr[j]) {
      ++i;
      j=i;
      //j=++i; 能够简写
    }
  }
  newAarry.push(arr[i]);
}

上张思路图,请疏忽字体的凌乱,其实字我是能够好好写的。

那么也心愿大家能关注我我都公众号 web-jianma,手机浏览随时随地~

退出移动版