普通数组去重
1 利用ES6的set
不会修改原数组,返回新数组
const arr = [1, 2, 1, 2, 3, 'a', 4, 'b', 'a', 'c', 5, 1]
const newArr = [...new Set(arr)]
console.log(arr) //[1, 2, 1, 2, 3, "a", 4, "b", "a", "c", 5, 1]
console.log(newArr) //[1, 2, 3, "a", 4, "b", "c", 5]
2 filter 和 indexOf 搭配使用
不会修改原数组,返回新数组
const arr = [1, 2, 1, 2, 3, 'a', 4, 'b', 'a', 'c', 5, 1]
const newArr = arr.filter((item, index) => arr.indexOf(item) === index)
console.log(arr) //[1, 2, 1, 2, 3, "a", 4, "b", "a", "c", 5, 1]
console.log(newArr) //[1, 2, 3, "a", 4, "b", "c", 5]
filter() 可以用 map() 或者 forEach等方法代替
利用splice直接在原数组进行操作
splice 修改原数组,同时利用对象的key唯一性
let arr = [1, 2, 1, 2, 3, 'a', 4, 'b', 'a', 'c', 5]
let len = arr.length
for(var i=0; i<len; i++){
for(var j=i+1; j<arr.length; j++){
if(arr[i]==arr[j]){
arr.splice(j,1);
j--;
}
}
}
console.log(arr) //[2, 3, "a", 4, "b", "c", 5]
includes() 方法
let arr = [1, 2, 1, 2, 3, 'a', 4, 'b', 'a', 'c', 5]
let len = arr.length
var newArr =[];
for(let i = 0; i < len; i++) {
if( !newArr.includes( arr[i]) ) {
newArr.push(arr[i]);
}
}
console.log(newArr) //[1, 2, 3, "a", 4, "b", "c", 5]
reduce()
let arr = [1, 2, 1, 2, 3, 'a', 4, 'b', 'a', 'c', 5]
let newArr = arr.reduce((pre, cur) => {
!pre.includes(cur) && pre.push(cur)
return pre
}, [])
console.log(newArr) //[1, 2, 3, "a", 4, "b", "c", 5]
对象数组去重
const arr = [
{
name: 'lwb',
age: 20
},
{
name: 'psp',
age: 18
},
{
name: 'lwb',
age: 18
},
{
name: 'cmt',
age: 17
}
]
reduce方法1
function uniqueObj(ary, key) {
return ary.reduce((pre, cur) => {
!pre.find((item) => item[key] === cur[key]) && pre.push(cur)
return pre
}, [])
}
console.log(uniqueObj(arr, 'name'))
/* [
* { name: "lwb", age: 20 },
* { name: "psp", age: 18 },
* { name: "cmt", age: 17 }
* ]
*/
reduce方法2
function uniqueObj2(ary, key) {
const subObj = {}
return ary.reduce((pre, cur) => {
!subObj[cur[key]] && (subObj[cur[key]] = true) && pre.push(cur)
return pre
}, [])
}
console.log(uniqueObj2(arr, 'name'))
/* [
* { name: "lwb", age: 20 },
* { name: "psp", age: 18 },
* { name: "cmt", age: 17 }
* ]
*/