几种去重方式
'1' == new String('1')
'1' !== new String('1')
null == null
null === null
undefined == undefined
undefined === undefined
NaN != NaN
NaN !== NaN
/a/ != /a/
/a/ !== /a/
{} != {}
{} !== {}
var array = [1, 1, '1', '1', null, null, undefined, undefined, new String('1'), new String('1'), /a/, /a/, NaN, NaN];
一、for双重循环
进行===判断
function unique(array) {
// res用来存储结果
var res = [];
for (var i = 0, arrayLen = array.length; i < arrayLen; i++) {
for (var j = 0, resLen = res.length; j < resLen; j++ ) {
if (array[i] === res[j]) {
break;
}
}
// 如果array[i]是唯一的,那么执行完循环,j等于resLen
if (j === resLen) {
res.push(array[i])
}
}
return res;
}
=> [1, '1', null, undefined, String, String, /a/, /a/, NaN, NaN]
二、indexOf
indexOf 底层还是使用 === 进行判断
function unique(array) {
var res = [];
for (var i = 0, len = array.length; i < len; i++) {
var current = array[i];
if (res.indexOf(current) === -1) {
res.push(current)
}
}
return res;
}
=> [1, '1', null, undefined, String, String, /a/, /a/, NaN, NaN]
三、sort排序后去重
进行===判断
function unique(array) {
var res = [];
var sortedArray = array.concat().sort();
var seen;
for (var i = 0, len = sortedArray.length; i < len; i++) {
// 如果是第一个元素或者相邻的元素不相同
if (!i || seen !== sortedArray[i]) {
res.push(sortedArray[i])
}
seen = sortedArray[i];
}
return res;
}
=> [/a/, /a/, 1, '1', String, String, NaN, NaN, null, undefined]
四、filter+indexOf
function unique(array) {
var res = array.filter(function(item, index, array){
return array.indexOf(item) === index;
})
return res;
}
=> [1, '1', null, undefined, String, String, /a/, /a/]
五、sort+filter
function unique(array) {
return array.concat().sort().filter(function(item, index, array){
return !index || item !== array[index - 1]
})
}
=> [/a/, /a/, 1, '1', String, String, NaN, NaN, null, undefined]
六、Object键值对
function unique(array) {
var obj = {};
return array.filter(function(item, index, array){
return obj.hasOwnProperty(typeof item + JSON.stringify(item)) ? false : (obj[typeof item + JSON.stringify(item)] = true)
})
}
=> [1, '1', null, undefined, String, /a/, NaN]
七、Set
Set 认为尽管 NaN === NaN 为 false,但是这两个元素是重复的
var unique = (a) => [...new Set(a)]
=> [1, '1', null, undefined, String, String, /a/, /a/, NaN]
八、Map
function unique (arr) {
const seen = new Map()
return arr.filter((a) => !seen.has(a) && seen.set(a, 1))
}
=> [1, '1', null, undefined, String, String, /a/, /a/, NaN]