数组去重的几种方法

86 阅读1分钟

Set

let arr = [...new Set(array)]

splice

splice 操作元素的话 性能不太好 当前项一旦删除 后面项索引都发生改变

for (let i = 0; i < array.length-1; i++) {
  let currentItem = array[i],
      sliceArr = array.slice(i+1);
      if(sliceArr.indexOf(currentItem) > -1){
        array.splice(i+1, 1)
        //此时会有数据塌陷 要i--
        i--
      }
}

改进方式:先把重复的元素改为null 最后统一处理

 for (let i = 0; i < array.length-1; i++) {
  let currentItem = array[i],
      sliceArr = array.slice(i+1);
      if(sliceArr.indexOf(currentItem) > -1){
        array[i+1] = null
      }
}
array = array.filter(item => item!==null)

赋值一个新数组

let newArray = [...array]
for (let i = 0; i < array.length; i++) {
  let currentItem = array[i],
      sliceArr = array.slice(i+1);
      if(sliceArr.indexOf(currentItem) > -1){
        newArray.splice(i+1, 1)
      }
}
console.log(newArray);

创建一个新的空数组

let newArray = []
for (let i = 0; i < array.length; i++) {
  let currentItem = array[i],
      sliceArr = array.slice(i+1);
      if(sliceArr.indexOf(currentItem) === -1){
        newArray.push(currentItem)
      }
}

用最后一项补位

for (let i = 0; i < array.length-1; i++) {
  let currentItem = array[i],
      sliceArr = array.slice(i+1);
      if(sliceArr.indexOf(currentItem) > -1){
        array[i] = array[array.length - 1]
        array.length --
        i --
      }
}

对象中的健值对

拿数组中每一项向新容器中存储 如果已经存储过了 把当前项干掉

let obj = {}
for (let i = 0; i < array.length; i++) {
  const item = array[i];
  if(typeof obj[item] !== 'undefined'){
    array[i] = array[array.length - 1]
    array.length --
    i--
    continue
  }
  obj[item] = item
}

先排序再相邻比较(基于正则)

array.sort((a, b) => a-b) // 升序
array = array.join('@') + '@'
let reg = /(\d+@)\1*/g,
arr = []
array.replace(reg, (val, group) => {
  console.log(val,'------',group); 
  /* 打印信息
    1@ ------ 1@ 
    2@2@ ------ 2@   
    3@ ------ 3@  
    4@4@ ------ 4@
    5@ ------ 5@
    6@6@ ------ 6@
    7@ ------ 7@
    8@ ------ 8@
    9@9@ ------ 9@
  */
  arr.push(Number(group.slice(0, group.length-1)))
  // 或者 arr.push(parseFloat(group))
})