数组去重

1. 利用ES6中的 Set 方法去重

不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象。

let arr = [1,0,0,2,9,8,3,1]
function unique(arr) {
    return Array.from(new Set(arr))
 }
console.log(unique(arr));   // [1,0,2,9,8,3]
或者 console.log([...new Set(arr)]); // [1,0,2,9,8,3]

2. 使用双重for循环,再利用数组的splice方法去重(ES5常用)

var arr = [1, 5, 6, 0, 7, 3, 0, 5, 9, 5, 5]
function unique(arr) {
  for (var i = 0, iLen = arr.length; i < iLen; i++) {
    for (var j = i + 1, jLen = arr.length; j < jLen; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1)
        j-- // 每删除一个数j的值就减1
        jLen-- // j值减小时len也要相应减1(减少循环次数,节省性能)
        // console.log(j,jLen)
      }
    }
  }
  return arr
}
console.log(unique(arr)) //  1, 5, 6, 0, 7, 3, 9

3.利用数组的indexOf方法去重

注:array.indexOf(item,statt) 返回数组中某个指定的元素的位置,没有则返回-1

var arr = [1, -5, -4, 0, -4, 7, 7, 3]
function unique(arr) {
  var arr1 = [] // 新建一个数组来存放arr中的值
  for (var i = 0, len = arr.length; i < len; i++) {
    if (arr1.indexOf(arr[i]) === -1) {
      arr1.push(arr[i])
    }
  }
  return arr1
}
console.log(unique(arr)) // 1, -5, -4, 0, 7, 3

4. 利用数组的sort方法去重(相邻元素对比法)

注:array.sort( function ) 参数必须是函数,可选,默认升序

var arr = [5, 7, 1, 8, 1, 8, 3, 4, 9, 7]
function unique(arr) {
  arr = arr.sort()
  console.log(arr)

  var arr1 = [arr[0]]
  for (var i = 1, len = arr.length; i < len; i++) {
    if (arr[i] !== arr[i - 1]) {
      arr1.push(arr[i])
    }
  }
  return arr1
}
console.log(unique(arr)) 

5.利用对象的属性不能相同的特点去重

注:用数组项作为对象的属性会自动去除相同的值

var arr = [1, 3, 8, 9, 3, 5, 4, 4, 6, 6, 2]
function unique(arr) {
  var ret = []
  var hash = {}

  for (var i = 0; i < arr.length; i++) {
    var item = arr[i]
    var key = typeof (item) + item
    if (hash[key] !== 1) {
      ret.push(item)
      hash[key] = 1
    }
  }

  return ret
}
or
function unique(arr) {
  var arr1 = []
  var obj = {}
  for (var i = 0, len = arr.length; i < len; i++) {
    if (!obj[arr[i]]) {
      arr1.push(arr[i])
      obj[arr[i]] = 1
    } else {
      obj[arr[i]]++
    }
  }
  return arr1
}
console.log(unique(arr)) //  1, 3, 8, 9, 5, 4, 6, 2

6.利用数组的includes去重

注:arr.includes(指定元素(必填),指定索引值(可选,默认值为0) ),有值返回true,没有则返回false

var arr = [-1, 0, 8, -3, -1, 5, 5, 7]
function unique(arr) {
  var arr1 = []
  for (var i = 0, len = arr.length; i < len; i++) {
    if (!arr1.includes(arr[i])) { // 检索arr1中是否含有arr中的值
      arr1.push(arr[i])
    }
  }
  return arr1
}
console.log(unique(arr)) //  -1, 0, 8, -3, 5, 7

7.利用数组的filter方法去重

var arr = [1, 2, 8, 9, 5, 8, 4, 0, 4]
/*
模拟: 原始数组:[1,2,8,9,5,8,4,0,4]
         索引值:0,1,2,3,4,5,6,7,8
      伪新数组:[1,2,8,9,5,8,4,0,4]
  使用indexOf方法找到数组中的元素在元素在中第一次出现的索引值
        索引值:0,1,2,3,4,2,6,7,6
      返回前后索引值相同的元素:
        新数组:[1,2,8,9,5,4,0]
*/
function unique(arr) {
  // 如果新数组的当前元素的索引值 == 该元素在原始数组中的第一个索引,则返回当前元素
  return arr.filter(function(item, index) {
    return arr.indexOf(item, 0) === index
  })
}
console.log(unique(arr)) //  1, 2, 8, 9, 5, 4, 0

8.利用函数递归去重

var arr = [1, 1, 5, 6, 0, 9, 3, 0, 6]
function unique(arr) {
  var arr1 = arr
  var len = arr1.length
  arr1.sort((a, b) => {
    return a - b
  })
  function loop(index) {
    if (index >= 1) {
      if (arr1[index] === arr1[index - 1]) {
        arr1.splice(index, 1)
      }
      loop(index - 1) // 递归loop,然后数组去重
    }
  }
  loop(len - 1)
  return arr1
}
console.log(unique(arr)) //   0, 1, 3, 5, 6, 9

9.利用ES6中的Map方法去重

/*
*创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。
*/
const arr = [1, 0, 8, 3, -9, 1, 0, -9, 7]
function unique(arr) {
  const map = new Map()
  console.log(map)
  // let arr1 = new Array();      // 数组用于返回结果
  const arr1 = []
  for (let i = 0, len = arr.length; i < len; i++) {
    if (map.has(arr[i])) { // 判断是否存在该key值
      map.set(arr[i], true)
    } else {
      map.set(arr[i], false)
      arr1.push(arr[i])
    }
  }
  return arr1
}
console.log(unique(arr)) // 1, 0, 8, 3, -9, 7

10.利用hasOwnProperty

var arr = [1, 5, 6, 0, 7, 3, 0, 5, 9, 5, 5]
function unique(arr) {
  var obj = {}
  return arr.filter(function(item, index, arr) {
    return Object.prototype.hasOwnProperty.call(obj, typeof item + item) ? false : (obj[typeof item + item] = true)
  })
}
console.log(unique(arr))

11.利用reduce+includes

var arr = [1, 5, 6, 0, 7, 3, 0, 5, 9, 5, 5]
function unique(arr) {
  return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], [])
}
console.log(unique(arr))

12. JSON 数组去重, 相同 key值 累加

需求描述:去除JSON数组中chnlNo字段相同的项,并将amount累加。

paylist:[{chnlNo:"现金",amount:300,type:2}, {chnlNo:"支付宝",amount:"100",type:2},

{chnlNo:"银行卡",amount:"400",type:2}, {chnlNo:"现金",amount:200,type:2}]

function UniquePay(paylist) {
  var payArr = [paylist[0]]
  for (var i = 1; i < paylist.length; i++) {
    var payItem = paylist[i]
    var repeat = false
    for (var j = 0; j < payArr.length; j++) {
      if (payItem.chnlNo === payArr[j].chnlNo) {
        payArr[j].amount = parseFloat(payArr[j].amount) + parseFloat(payItem.amount)
        repeat = true
        break
      }
    }
    if (!repeat) {
      payArr.push(payItem)
    }
  }
  return payArr
}

13. JSON 数组去重

/*
 * JSON数组去重
 * @param: [array] json Array
 * @param: [string] 唯一的key名,根据此键名进行去重
 */

function uniqueArray(array, key) {
  var result = [array[0]]
  for (var i = 1; i < array.length; i++) {
    var item = array[i]
    var repeat = false
    for (var j = 0; j < result.length; j++) {
      if (item[key] === result[j][key]) {
        repeat = true
        break
      }
    }
    if (!repeat) {
      result.push(item)
    }
  }
  return result
}

来源自

1、https://www.cnblogs.com/zsp-1064239893/p/11196501.html
2、https://blog.csdn.net/jiandan1127/article/details/83539199

你可能感兴趣的:(数组去重)