1. indexOf
function unique(arr) {
return arr.filter(function (item, index) {
return arr.indexOf(item) === index;
})
}
function unique(arr) {
var ret = [];
arr.forEach(function (item) {
if (ret.indexOf(item)===-1) {
ret.push(item);
}
})
}
- indexOf() 用的是严格比较,===
- === 不能处理 NaN 的相等性判断,即 NaN === NaN 结果为 false
2. includes
function unique(arr) {
var ret = [];
arr.forEach(function (item) {
if (!ret.includes(item)) {
ret.push(item);
}
})
}
- includes中,当x=NaN,y=NaN,则x=y
3. Map
function unique(arr) {
var ret = [];
var tmp = new Map();
for (var i=0; i<arr.length; i++) {
if (!tmp.get(arr[i])) {
tmp.set(arr[i], 1);
ret.push(arr[i]);
}
}
return ret;
}
4. Set
function unique(arr) {
var set = new Set(arr);
return Array.from(set);
}
其他方法
- 双重遍历循环
function unique(arr) {
var ret = [];
for (var i=0; i<arr.length; i++) {
for (var j=i+1; j<arr.length; j++) {
if (arr[i] === arr[j]) {
j = ++i;
}
}
ret.push(arr[i]);
}
return ret;
}
- 中间对象 key 去重
function unique(arr) {
var temp = {},
ret = [];
for (var i=0;i<arr.length;i++) {
if (!temp[arr[i]]) {
temp[arr[i]] = 1;
ret.push(arr[i]);
}
}
return ret;
}
- 与 map 方法类似,但存在 key 的限制,如 proto 、 对象、数组