js数组的去重组练习,给出一个数组,把里面重复的元素去除,留下所有不重复的元素
var arr = [1,2,4,1,3,4,5];
分析:
1 | 2 | 4 | 1 | 3 | 4 | 5 |
如果我们不用编程采用基本的算法思想我们该会怎么处理呢
可能会想到这样吧
1 | 2 | 4 | 1 | 3 | 4 | 5 |
1 把第一位拿出来与第二位(含第二位)后面依次比较,重复的去除
1 | 2 | 4 | 1 | 3 | 4 | 5 |
2 把第二位拿出来与第三位(含第三位)后面的比,去除重复
1 | 2 | 4 | 1 | 3 | 4 | 5 |
4 把第三位拿出来与第四位(含第四位)后面的比,去除重复
..................................后面的同理,依次提取数据与该数据后面的元素对比,去除
有了基本的思想我们来敲代码实现一下吧
//去除数组中重复的数字
var arr = [1,2,4,1,3,4,5];
//for循环遍历数组把每一位元素取出来
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
//再次for循环 遍历出当前i后面的所有元素除了(i)
for(j=i+1;j<arr.length;j++){
console.log('------>'+arr[j]);
}
}
先把基本的思想代码实现一下
看下控制台效果吧
可以发现我们把数组arr[i]中每个元素遍历出来了,并且输出了每个i元素后的数据
如: 当 i=1; 他后面的元素 j为: 2,4,1,3,4,5
把数组arr[i]的元素遍历出来之后,当i=0,1,2,3,4,5,6时,随之它后面的数据(除i本身)以arr[j]数组的形式遍历出来了 ,这样我们就可以拿着arr[i]的数据与arr[j](i,后面的每个元素)与之对比,去掉arr[j]中重复的数据了,就基本实现了效果
看下代码实现吧
var arr = [1,2,4,1,3,4,5];
//for循环遍历数组把每一位元素取出来
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
//再次for循环 遍历出当前i后面的所有元素除了(i)
for(j=i+1;j<arr.length;j++){
console.log('------>'+arr[j]);
//如果相等证明出现了重复的元素
if(arr[i] == arr[j]){
arr.splice(j,1)
}
}
}
console.log(arr);
这里说明一下这个splice方法吧
第一个参数一般为要操作项目对应的数组下标,第二个参数为删除的数量,例如splice(2,0)表示什么也不做,splice(2,1 )表示删除一个数组下标为2的内容,splice(2,,2)表示从数组下标2对应的内容开始,删除两个,即删除下标为2 和下标为3的所对应的内容。
看数组 1,2,3,4,5效果实现了,数组重组去重完成了。
但是这串代码还有个bagel,就是当要去重组的数组中有连续两个相等数据(元素)时,/注意当删除了当前j所在的元素以后,后边的元素会自动补位,此时将不会比较这个元素(而这个连续的元素又是相同的,所以成了落网之鱼), 所以需要再比较一次j所在位置元素 我们只需要在内循环里面 加上 j--就可以完美的解决这个问题
比如;bug : 我们改了一下这个数组
var arr = [1,2,2,2,4,1,3,4,5];
控制台bug效果:
我们可以这样解决:
内循环中j--,j++就重复多比了一次,
完整代码:
//去除数组中重复的数字
var arr = [1,2,2,2,4,1,3,4,5];
//for循环遍历数组把每一位元素取出来
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
//再次for循环 遍历出当前i后面的所有元素除了(i)
for(j=i+1;j<arr.length;j++){
console.log('------>'+arr[j]);
//如果相等证明出现了重复的元素
if(arr[i] == arr[j]){
arr.splice(j,1)
j--; //加上j--就好了,多比了一次
}
}
}
console.log(arr);
效果再次实现:
一起学习吧,错误之处,指正哦。