1.lodash库的uniqBy方法
_.uniqBy(array, [iteratee=_.identity])
array是要比较的数组,iteratee是一个可选的函数,用于确定元素的唯一性。如果不提供该函数,将使用默认的 _.identity
函数,即直接比较元素的值。
2. [...new Set]
这个方法的缺点是数组中不能有复杂数据类型,因为set里做的是严格等,地址不同也会判不等
3.手写,效率肯定不如lodash优化过的,面试可用
function customUniqBy(arr, iteratee) {
const uniqueArr = [];
function isUnique(element) {
return !uniqueArr.some(item => deepEqual(iteratee(item), iteratee(element)));
}
function deepEqual(a, b) {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
for (const key of keysA) {
if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
}
return true;
}
for (let i = 0; i < arr.length; i++) {
const currentElement = arr[i];
if (isUnique(currentElement)) {
uniqueArr.push(currentElement);
}
}
return uniqueArr;
}
const arr = [
{ id: 1, nested: { name: 'John' } },
{ id: 2, nested: { name: 'Jane' } },
{ id: 1, nested: { name: 'John' } },
{ id: 3, nested: { name: 'Bob' } }
];
const uniqueArr = customUniqBy(arr, item => item.nested);
console.log(uniqueArr);