方法一:利用ES6 Set去重(ES6中最常用)
let arr = [
1,
1,
'true',
'true',
true,
true,
undefined,
undefined,
null,
null,
NaN,
NaN,
{},
{}
];
function unique(arr) {
return Array.from(new Set(arr));
// 等价于return [...new Set(arr)];
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, NaN, {…}, {…}]
// {}没有去重
方法二:利用for嵌套for,然后splice去重(ES5中最常用)
function unique(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
return arr;
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, NaN, NaN, {…}, {…}]
// NaN {}没有去重
方法三:利用indexOf去重
function unique(arr) {
if (!Array.isArray(arr)) {
console.error('type error!');
return;
}
let temp = [];
for (let i = 0; i < arr.length; i++) {
if (temp.indexOf(arr[i]) === -1) {
temp.push(arr[i]);
}
}
return temp;
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, NaN, NaN, {…}, {…}]
// NaN {}没有去重
方法四:利用sort()
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!');
return;
}
arr = arr.sort();
let temp = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i - 1]) {
temp.push(arr[i]);
}
}
return temp;
}
console.log(unique(arr));
// [1, NaN, NaN, {…}, {…}, null, 'true', true, undefined]
// NaN {}没有去重
方法五:利用对象的属性不能相同的特点进行去重
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!');
return;
}
let temp = [];
let obj = {};
for (let i = 1; i < arr.length; i++) {
if (!obj[arr[i]]) {
temp.push(arr[i]);
obj[arr[i]] = 1;
} else {
obj[arr[i]]++;
}
}
return temp;
}
console.log(unique(arr));
// [1, 'true', undefined, null, NaN, {…}]
// 两个true直接去掉了
方法六:利用includes
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!');
return;
}
let temp = [];
for (let i = 0; i < arr.length; i++) {
if (!temp.includes(arr[i])) {
temp.push(arr[i]);
}
}
return temp;
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, NaN, {…}, {…}]
// {}没有去重
方法七:利用hasOwnProperty
function unique(arr) {
let obj = {};
return arr.filter(item => {
// eslint-disable-next-line no-return-assign
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true);
});
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, NaN, {…}]
// 全部去重
方法八:利用filter
function unique(arr) {
return arr.filter(function(item, index, arr) {
// 当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
return arr.indexOf(item, 0) === index;
});
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, {…}, {…}]
// 两个NaN直接去掉了,{}没有去重
方法九:利用递归去重
function unique(arr) {
let temp = arr;
let len = temp.length;
temp.sort(function(a, b) {
// 排序后更加方便去重
return a - b;
});
function loop(index) {
if (index >= 1) {
if (temp[index] === temp[index - 1]) {
temp.splice(index, 1);
}
loop(index - 1); // 递归loop,然后数组去重
}
}
loop(len - 1);
return temp;
}
console.log(unique(arr));
// [1, 'true', null, true, NaN, NaN, {…}, {…}, undefined]
// NaN {}没有去重
方法十:利用Map数据结构去重
function unique(arr) {
let map = new Map();
// eslint-disable-next-line no-array-constructor
let array = new Array(); // 数组用于返回结果
for (let i = 0; i < arr.length; i++) {
if (map.has(arr[i])) {
// 如果有该key值
map.set(arr[i], true);
} else {
map.set(arr[i], false); // 如果没有该key值
array.push(arr[i]);
}
}
return array;
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, NaN, {…}, {…}]
// {}没有去重
方法十一:利用reduce+includes
function unique(arr) {
return arr.reduce((prev, cur) => (prev.includes(cur) ? prev : [...prev, cur]), []);
}
console.log(unique(arr));
// [1, 'true', true, undefined, null, NaN, {…}, {…}]
// {}没有去重