【经典】数组去重问题(to实习的小朋友们)

223 阅读2分钟

数组去重也算是很经典的面试题了,记得实习的时候几乎每个面试官都会问。今天来总结一下我印象里的方式(随着es6的到来,数组去重真的太多花样了,我只列举一下我脑海里最先蹦出来的几种方案)。

const arr = [1, 3, 5, 6, 2, 3, 3, 1, 7];

以下方法同时有很多变种,就不一一标注啦。

第一种:结合Set数据类型的唯一性去重

function unique(arr) {
	// 也可以用Array.from()
	// return Array.from(new Set(arr)); 
	return [...new Set(arr)];
}
unique(arr)
// [1, 3, 5, 6, 2, 7]

第二种:结合Array.prototype.filter()

function unique(arr) {
	return arr.filter((i, index, self) => self.indexOf(i) === index);
}
unique(arr)
// [1, 3, 5, 6, 2, 7]

第三种:利用Array.prototype.reduce()去重

function unique(arr) {
	return arr.reduce((cur, next) => {
    	// 这里用 includes / some / indexOf / find / findIndex 可以得到一些变种方法
		!cur.includes(next) && cur.push(next);
		return cur;
	},[]);
}
unique(arr)
// [1, 3, 5, 6, 2, 7]

值得一提的是,这个方法也可以用来给某成员为对象的数组根据某一属性去重,拿id为例

const arr = [
	{
    	id: 3,
        name: 'Amy',
    },
    {
    	id: 2,
        name: 'Lingling',
    },
    {
    	id: 2,
        name: 'Daming',
    },
    {
    	id: 2,
        name: 'Sam',
    }
]
function unique(arr) {
	return arr.reduce((cur, next) => {
    	// 这里用 includes / some / indexOf / find / findIndex 可以得到一些变种方法
		!cur.find(i => next.id === i.id) && cur.push(next);
		return cur;
	},[]);
}
unique(arr)
// [{...}, {...}]
// 0: {id: 3, name: "Amy"}
// 1: {id: 2, name: "Lingling"}

第四种:利用Map数据结构去重。

这里要提一下,可能有的同学会想到是不是也可以利用Object属性不能重复的特性去重,建议不要使用,Object的属性顺序是不稳定的,可能去重以后的keys得到的不是原本的顺序,而且属性都变成了字符串,所以慎用。

function unique(arr) {
	const mapItem = new Map();
    return arr.filter(i => !mapItem.has(i) && mapItem.set(i, true));
}
unique(arr)
// [1, 3, 5, 6, 2, 7]

第五种:利用双循环或者递归。

欢迎评论区补充你的想法~