前言
在开发中,javascript数组去重是一个比较常见的需求,解决方法也有很多种,最佳的方法取决于数据类型和去重需求。
js实现数组去重的11种方法
js实现对象数组去重的6种方法
1、使用 .filter() 和 .findIndex() 相结合的方法
使用 filter() 方法过滤掉重复的元素,使用 findIndex() 方法判断对象是否重复
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}]; const uniqueArr = arr.filter((item, index) => arr.findIndex(i => i.id === item.id) === index); console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
2、使用 .reduce() 方法
使用 reduce() 方法维护一个累加器,通过对象的属性来判断是否重复
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}]; const uniqueArr = arr.reduce((acc, curr) => { if (!acc.find(item => item.id === curr.id)) { acc.push(curr); } return acc; }, []); console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
3、使用 .forEach() 和 .some() 相结合的方法
使用 forEach() 方法遍历数组,使用 some() 方法判断是否重复
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}]; const uniqueArr = []; arr.forEach(item => { if (!uniqueArr.some(i => i.id === item.id)) { uniqueArr.push(item); } }); console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
4、使用 Map
使用 Map 结构去重对象数组时,需要借助 array.map() 函数将对象数组进行转换
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}]; const uniqueArr = [...new Map(arr.map(item => [item.id, item])).values()]; console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
5、使用 Object.create()
使用Object.create(),按照对象的属性来判断是否重复
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}]; const uniqueArr = arr.filter(function (item) { return !this[item.id] && (this[item.id] = true); }, Object.create(null)); console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
6、使用 For const of 和 find 结合
这个方法的思想与方法3类似
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "c"}, {id: 3, name: "d"}]; const unique = []; for (const item of arr) { const isDuplicate = unique.find((obj) => obj.id === item.id); if (!isDuplicate) { unique.push(item); } } console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
针对多个属性进行去重
有时候,您可能希望仅当对象具有两个或多个具有相同值的属性时才将其视为重复对象——多个属性值相同。对于这种情况,我们可以将上述方法进行稍微调整就可以进行使用。
使用 .filter() 和 .findIndex() 相结合的方法
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "a"}, {id: 3, name: "d"}]; const uniqueArr = arr.filter((item, index) => arr.findIndex(i => i.id === item.id && i.name === item.name) === index); console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]
使用 For const of 和 find 结合的方法
const arr = [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 1, name: "a"}, {id: 3, name: "d"}]; const uniqueArr = []; for (const item of arr) { const isDuplicate = uniqueArr.find((obj) => obj.id === item.id && obj.name ==item.name); if (!isDuplicate) { uniqueArr.push(item); } } console.log(uniqueArr) // [{id: 1, name: "a"}, {id: 2, name: "b"}, {id: 3, name: "d"}]