Javascript -- 数组去重方法

时间:2022-12-12 16:44:42

一、数组去重

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)

这个就不去深究了