跳到主要内容

数组去重

一、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);