一、数组去重
1、双循环去重
var data = [1,2,4,3,5,2,1,3,2]
var newData = []
for(var i=0;i<data.length;i++) {
for(var j=i+1;j<data.length;j++) {
if (data[i] == data[j]) {
// j = i = i + 1
j = ++i
}
}
newData.push(data[i])
}
console.log(newData.sort())
外面循环是每次取数组一个值,里面的循环是遍历除了取了的值以外的后面的所有值作比较,如果有相等的话,就跳过进行下轮循环比较,如果当前值没有找到任何相等的值,就添加到新数组
这个就是取数组里面的值取一一比较,如果这个值在数组后面的项里有了,那我就不要这个值,依次类推,其实就是取数组里这个值的最后一项,因为已经是最后一项了,不可能有相等的
2、双循环+splice去重
const arr = [1, 2, 3, 5, 4, 3, 2, 1];
for (var i=0;i<arr.length; i++) {
for (var j=i+1;j<arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j,1)
j--
}
}
}
console.log(arr)
// 打印结果
[1, 2, 3, 5, 4]
通过双循环判断数组里是否有相同的值,如果有相同的值,就将后面相同的值去掉,splice方法会改变原数组,splice()方法返回的是分割的值的数组,原数组就是除去被分割出去的值后剩余值的数组
为社么j--?因为分割后,原数组长度减一了,上一个值降下来了,如果j不减1,在数组里面的j就是上一个值了,在加一下,就相当于跳过了,所以需要减1然后再执行循环里的加1获取上一个值
3、循环+闭包+indexOf
var data = [1,2,4,3,5,2,1,3,2]
var newData = []
for(var i=0;i<data.length;i++) {
;(function () {
if (newData.indexOf(data[i]) === -1) {
newData.push(data[i])
}
})(i);
}
console.log(newData.sort())
通过循环遍历,传入循环数组的索引,然后通过indexOf
判断新数组里面是否有这个数组索引的值,如果没有,则将数组索引的值添加到新数组里面
4、循环+对象
var data = [1,2,4,3,5,2,1,3,2]
var newData = []
var obj = {}
for(var i=0;i<data.length;i++) {
if (!obj[data[i]]) {
obj[data[i]] = 1
newData.push(data[i])
}
}
console.log(newData.sort())
这个方法利用的就是同一个对象的key
值不能重复,所以通过判断对象里是否有当前数组索引的值,如果没有,则将这个数组值作为key
添加到对象里面,通过也把这个值添加到新数组里面,如果对象有这个key
值和数组索引的值相同,则跳过
5、ES6语法-Set
var data = [1,2,4,3,5,2,1,3,2]
var newData = []
newData = new Set(data)
console.log(newData)
这个就不去深究了