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