题目描述
为 Array 对象添加一个去除重复项的方法
示例1
输入
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
输出
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
思路一
利用Set去重。
题解一
Array.prototype.uniq = function () {
return Array.from(new Set(this));
}
思路二
用空间换时间。用一个Object对象或者Map存基本类型的数据出现过与否,出现过进行拦截;引用类型的数据直接放行。
题解二
Array.prototype.uniq = function () {
let newArr = [];
let vis = {};
for(let i=0;i<this.length;i++){
if(["number", "boolean", "string", "symbol", "null", "undefined"].includes(typeof this[i])){
if(!vis[`${typeof this[i]}${this[i]}`]){
vis[`${typeof this[i]}${this[i]}`] = true;
newArr.push(this[i]);
}
} else {
newArr.push(this[i]);
}
}
return newArr;
}
扩展
这道题不需要判断引用类型是否相等,如果有这个需要,那就更加麻烦。这里的“引用类型相等”是引用同一个对象而不是内容完全相等。
我们可以通过判等去判断两个引用对象是否相等,但是我们不能获取内存地址或者其它标识符进行识别。
如果在需要判断引用类型是否相等的情况下,有除了Set和暴力一一对比之外的方法,欢迎交流探讨。