数组去重
一、forEach、some
function is(x, y) {
if (x === y) {
return x !== 0 || y !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
}
function unique(array) {
const result = [];
array.forEach((value) => {
if (!result.some((v) => is(v, value))) {
result.push(value);
}
});
return result;
}
二、reduce、some
function is(x, y) {
if (x === y) {
return x !== 0 || y !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
}
function unique(array) {
return array.reduce((prev, curr) => {
return prev.concat(prev.some((v) => is(v, curr)) ? [] : [curr]);
}, []);
}
三、filter、findIndex
function is(x, y) {
if (x === y) {
return x !== 0 || y !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
}
function unique(array) {
return array.filter((value, index) => {
return array.findIndex((_value) => is(_value, value)) === index;
});
}
四、Set
function unique(array) {
return Array.from([...new Set(array)]);
}
五、对象属性
function unique(array) {
const result = [];
const resultMap = {};
const length = array.length;
for (let i = 0; i < length; i++) {
if (!Object.prototype.hasOwnProperty.call(resultMap, array[i])) {
resultMap[array[i]] = true;
result.push(array[i]);
}
}
return result;
}
六、Map 键值
function unique(array) {
const result = [];
const map = new Map();
const length = array.length;
for (let i = 0; i < length; i++) {
if (!map.has(array[i])) {
map.set(array[i], true);
result.push(array[i]);
}
}
return result;
}
七、测试数据
const array = [
34,
23,
53,
23,
53,
"张文强",
"张文强",
null,
null,
undefined,
undefined,
{},
{},
23,
"张文强",
34,
NaN,
NaN,
];
const result = unique(array);
console.log(result);