不考虑兼容的情况:
let arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}, [1, 2], [1, 2]]
使用ES6规范
1)、Array.from(new Set(arr)) // 无法对数组中的数组和对象去重
2)、[…new Set(arr)] // 无法对数组中的数组和对象去重
兼容写法:
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}, [1, 2], [1, 2]]
1)、for循环嵌套对比 // 无法对数组中的NaN、数组和对象去重
function unquie(array) {
if (!Array.isArray(array)) return 'data is not a array'
for (var i = 0; i < array.length; i++) {
for (var j = i + 1; j < array.length; j++) {
if (array[i] === array[j]) {
array.splice(j, 1);
j--;
}
}
}
return array
}
console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]
2)、使用空数组+indexOf 组合使用 // 无法对数组中的NaN、数组和对象去重
function unquie(array) {
if (!Array.isArray(array)) return 'data is not a array'
var _array = []
for (var i = 0; i < array.length; i++) {
if (_array.indexOf(array[i]) === -1) {
_array.push(array[i])
}
}
return _array
}
console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]
3)、使用空数组+includes // 无法对数组中的数组和对象去重
function unquie(array) {
if (!Array.isArray(array)) return 'data is not a array'
var _array = []
for (var i = 0; i < array.length; i++) {
if (!_array.includes(array[i])) {
_array.push(array[i])
}
}
return _array
}
console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]
4)、使用数组的reduce方法+includes 组合 // 无法对数组中的数组和对象去重
function unquie(array) {
if (!Array.isArray(array)) return 'data is not a array'
return array.reduce(function (prev, next) {
if (!prev.includes(next)) prev.push(next)
return prev
}, [])
}
console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]
5)、使用Object.hasOwnProperty + filter // 可以对数组和对象去重,对复杂数组的最优解
function unquie(array) {
if (!Array.isArray(array)) return 'data is not a array'
var obj = {}
return array.filter(function (item) {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
console.log(unquie(arr))
// [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {},[1, 2]]
6)、使用filter + includes // 无法对数组中的数组和对象去重,对NaN直接去除
function unquie(array) {
if (!Array.isArray(array)) return 'data is not a array'
return array.filter(function (item, index) {
return array.indexOf(item) === index
})
}
console.log(unquie(arr))
// [1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {}, {}, [1, 2], [1, 2]]
7)、使用new Map // 无法对数组中的数组和对象去重
function unquie(array) {
if (!Array.isArray(array)) return 'data is not a array'
var map = new Map()
var _array = []
for (var i = 0; i < array.length; i++) {
if (!map.has(array[i])) {
map.set(array[i], false)
_array.push(array[i])
}
}
return _array
}
console.log(unquie(arr))
// [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {}, {}, [1, 2], [1, 2]]