1. 不使用Map, Set, 一次遍历,间复杂度为O(n)
2. NaN判断需要使用isNaN函数,Object对象是引用类型,不需要去重
3. 使用系统内对象存储键值,(字符串和数字分开存储,避免[1, '1']的情况)
Array.prototype.uniq = function () {
let numberMap = {};
let stringMap = {};
let hasNull = false, hasUndefined = false, hasNaN = false;
let res = [];
for (let i = 0; i < this.length; i++) {
let e = this[i];
let type = Object.prototype.toString.call(e);
switch (type) {
case '[object Null]':
if (!hasNull) {
res.push(e);
hasNull = true;
}
break;
case '[object Undefined]':
if (!hasUndefined) {
res.push(e);
hasUndefined = true;
}
break;
case '[object Number]':
if (isNaN(e)) {
if (!hasNaN) {
res.push(e);
hasNaN = true;
}
} else if (!numberMap[e]) {
res.push(e);
numberMap[e] = true;
}
break;
case '[object Boolean]':
case '[object String]':
if (!stringMap[e]) {
res.push(e);
stringMap[e] = true;
}
break;
case '[object Symbol]':
case '[object Function]':
case '[object Object]':
case '[object Array]':
res.push(e);
break;
}
}
return res;
};



京公网安备 11010502036488号