方式一:使用 Set
const handler = (array) => {
return [...new Set(array)];
}
const array = [1, 2, 2, 3, 3, 4, 5, 5];
console.log(handler(array)); // [1, 2, 3, 4, 5]
方式二:使用filter
const handler = (array) => {
return array.filter((item, index) => array.indexOf(item) === index);
}
const array = [1, 2, 2, 3, 3, 4, 5, 5];
console.log(handler(array)); // [1, 2, 3, 4, 5]
方式三:使用reduce
const handler = (array) => {
return array.reduce((accumulator, currentValue) => {
if (!accumulator.includes(currentValue)) {
accumulator.push(currentValue);
}
return accumulator;
}, []);
}
const array = [1, 2, 2, 3, 3, 4, 5, 5];
console.log(handler(array)); // [1, 2, 3, 4, 5]
方式四:复杂类型也需要去重
由于严格相等
对于复杂类型是判断址
,所以多个复杂类型的内容
相同时,也需要去重。
声明判断两个值是否相等的方法
function isEqual(a, b) {
// 如果 a 和 b 是基本类型或者相等,则直接返回 true
if (a === b) {
return true;
}
// 如果 a 和 b 是对象
if (typeof a === 'object' && typeof b === 'object') {
// 如果 a 和 b 的键数量不相等,则直接返回 false
if (Object.keys(a).length !== Object.keys(b).length) {
return false;
}
// 递归比较对象的每个键值对
for (let key in a) {
if (!isEqual(a[key], b[key])) {
return false;
}
}
return true;
}
// 如果 a 和 b 是数组
if (Array.isArray(a) && Array.isArray(b)) {
// 如果数组长度不相等,则直接返回 false
if (a.length !== b.length) {
return false;
}
// 递归比较数组的每个元素
for (let i = 0; i < a.length; i++) {
if (!isEqual(a[i], b[i])) {
return false;
}
}
return true;
}
// 其他情况返回 false
return false;
}
根据上面的函数返回值作为判断条件
function handler(arr) {
let result = []
for (let i = 0; i < arr.length; i++) {
let isFind = false
for (let j = 0; j < result.length; j++) {
if (isEqual(result[j], arr[i])) {
isFind = true
break
}
}
if (!isFind) {
result.push(arr[i])
}
}
return result
}
let a = [[1, 2], [1, 2], ["1", "2"], [1, "2"], [1, 2, 3]]
console.log(handler(a))