数组去重的六种方案

数组去重

1. 先排序, 后删除相邻重复的元素

例如: 可以手写排序算法先将数组进行排序, 也可以使用数组方法 sort() 对数组进行排序, 之后相邻两两进行判断是否重复, 重复即使用数组方法 splice() 进行去重

var arr1 = [1, 2, 3, 1, 9, 6, 4, 5, 7, 1, 4, 5, 6];
console.log("原数组: ", arr1)
arr1.sort(function (a, b) {
  return a - b
})
console.log("排序后: ", arr1)

for (var i = 0; i < arr1.length - 1; i++) {
  if (arr1[i] == arr1[i + 1]) {
    arr1.splice(i, 1);
    i--;
  }
}
console.log("去重后: ", arr1)

2. 遍历数组判断是否存在相同元素

例如: 建一个新数组, 遍历原数组(需要去重的数组), 在循环中新数组调用 indexOf() 查找新数组中是否存在原数组的该元素, 若返回值为 -1, 即将该元素添加到新数组, 最后新数组即为去重后的数组

var arr2 = [1, 2, 3, 1, 9, 6, 4, 5, 7, 1, 4, 5, 6]
var arr22 = []
for (var i = 0; i < arr2.length; i++) {
  if (arr22.indexOf(arr2[i]) == -1) {
    arr22.push(arr2[i])
  }
}
console.log("去重后: ", arr22)

3. 遍历数组, 依次比对直至无元素重复

例如: 遍历数组, 遍历次数为数组长度-1, 从下标 0 的位置开始, 调用方法 indexOf() 判断该元素是否重复, 重复复及去除该元素(数组将塌陷一个单位), 循环索引-1, 重复判断该下标位置直至该下标位置不存在重复项, 才进入下一个位置循环, 直至数组去重完成

var arr3 = [1, 2, 3, 1, 9, 6, 4, 5, 7, 1, 4, 5, 6]
for (var i = 0; i < arr3.length - 1; i++) {
  var index = arr3.indexOf(arr3[i], i + 1) // -1 或者 对应下标
  if (index != -1) {
    arr3.splice(index, 1); // 重复位置删除
    i--;
  }
}
console.log("去重后: ", arr3)

4. 原理类似 方案3

例如: 避免了数组塌陷, 采用循环嵌套的方式, 找出重复元素并删除, 直至无重复元素

var arr4 = [1, 2, 3, 1, 9, 6, 4, 5, 7, 1, 4, 5, 6]
for (var i = 0; i < arr4.length; i++) {
  var index = arr4.indexOf(arr4[i], i + 1);
  while (index != -1) {
    arr4.splice(index, 1)
    index = arr4.indexOf(arr4[i], i + 1) // 注意 index 的值变化
  }
}
console.log("去重后: ", arr4)

5. 利用对象的性质进行数组去重

原理: 对象的 key 唯一, 且可以为 number 类型

例如: 准备一个空对象和空数组, 遍历需去重数组, 将数组元素以对象的 key 的形式’存储’下来, 然后遍历(for…in…)对象, 将对象的 key 添加到数组, 从而实现数组去重

var arr5 = [1, 2, 3, 1, 9, 6, 4, 5, 7, 1, 4, 5, 6]
var obj = {};
var arr55 = [];
for (var i = 0; i < arr5.length; i++) {
  obj[arr5[i]] = " ";  // 将 数组元素的值 以对象obj的 键 存储
}
for (var key in obj) {
  arr55.push(key - 0)  // 注意数据类型
}
console.log("去重后: ", arr55)

【注】 此方法对纯数字数组较友好, 其他类型不太友好, 并且需要注意数据类型, 对象的 key 为string类型

6. 利用数据类型 Set 的性质进行数组去重

原理: Set 类型的变量不接受重复数据

例如: 将需去重的数组转为 Set 数据类型, 该过程即完成去重操作, 在转为数组即可完成数组去重

var arr6 = [1, 2, 3, 1, 9, 6, 4, 5, 7, 1, 4, 5, 6]
var s = new Set(arr6)  // 转为 Set 数据类型, 自然去重
console.log(s)
arr6.splice(0, arr6.length)  // 将原数组变为空数组
// 方法1-还原成数组
arr6 = Array.from(s)  // 将 Set 数据类型还原成数组
console.log("去重后-1: ", arr6)
// 方法2-还原成数组
arr6 = [...s]
console.log("去重后-2: ", arr6)

你可能感兴趣的:(javascript,前端)