uniqueObjects(arr){
const seen = new Set();
const symbolMap = new Map();
let symbolId = 0;
const getKey = (element) => {
if (element === null) {
return 'null';
}
const type = typeof element;
switch (type) {
case 'undefined':
return 'undefined';
case 'boolean':
return `boolean:${element}`;
case 'number':
return `number:${element}`;
case 'string':
return `string:${element}`;
case 'symbol':
if (!symbolMap.has(element)) {
symbolMap.set(element, symbolId++);
}
return `symbol:${symbolMap.get(element)}`;
case 'function':
return `function:${element.toString()}`;
case 'object':
if (Array.isArray(element)) {
const elements = element.map(getKey);
return `array:[${elements.join(',')}]`;
} else if (element instanceof Date) {
return `date:${element.toISOString()}`;
} else if (element instanceof RegExp) {
return `regexp:${element.toString()}`;
} else {
const keys = Object.keys(element).sort();
const keyValuePairs = keys.map(key => {
return `${getKey(key)}:${getKey(element[key])}`;
});
return `object:{${keyValuePairs.join(',')}}`;
}
default:
return `${type}:${element}`;
}
};
return arr.filter(item => {
const key = getKey(item);
return seen.has(key) ? false : seen.add(key);
});
},
满足所有目前使用的场景