**第一种:**双重for循环,只留下不重复的
<script>
// 重复的元素只保留一个
var arr = [4,2,5,7,2,6,2,6,6,5]
console.log(arr)
// 使用循环依次比较,遇到重复的就删除
// 比较length-1趟
for (var i = 0; i < arr.length - 1; i++) {
// 当前这一趟比较从i+1开始
// 比较的终点length-1
for (var j = i+1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1)
// 删完以后j-1抵消for里的++确保不跳过重复的值
j--
}
}
}
console.log(arr)
</script>
**第二种:**利用对象属性名不冲突
- 利用对象的属性名不冲突完成去重
可以把数字作为对象的属性名
var obj = {
4: 'lisi'
}
console.log(obj[4])
-
遍历数组,判断当前数组元素作为对象属性名是否能取到值
如果取不到,说明这是第一次遍历到当前值,就把当前元素作为对象属性名赋个值
如果取到了,说明之前已经赋过值了,也就是说当前值不是第一次出现
var obj = {}
var arr1 = []
arr.forEach(function (item) {
// 把item作为属性名到对象里去取值看能不能取到
if (obj[item]) {
// 取到值了,说明item不是第一次出现,item是一个无效值,就不用push到arr1里,这里就什么都不用做
} else {
// 取不到值,说明item是第一次出现
// 就给他赋个值
// item是第一次出现,他是我们要保留的值
obj[item] = true
arr1.push(item)
}
})
arr.forEach(function (item) {
// 把item作为属性名到对象里去取值看能不能取到
if (!obj[item]) {
// 取不到值,说明item是第一次出现
// 就给他赋个值
obj[item] = 'a'
arr1.push(item)
}
// else 就不用写了
// else {
// // 取到值了,说明item不是第一次出现
// }
})
console.log(arr1)
**第三种:**ES6(Set是一种新的数据类型,加强版数组,默认不允许重复)
var arr = [4,2,4,5,7,2,6,2,6,6,5]
// ES6的写法,把数组写成Set,Set是Es6新增的数据类型,默认不允许重复的
// 但是把数组变成Set了,再使用Array.from重新转换成数组,就可以了
var arr1 = Array.from(new Set(arr))
console.log(arr1)