我有一个包含这样的对象的数组:
const array = [
{name:'obj1', address: 987, id: '123', location: 'zyx' },
{name:'obj2', address: 654, id: '456', location: 'wvu'},
{name:'obj3', address: 321, id: '123', location: 'zyx'}
];
并且我想使用功能比较它们来删除重复项:
const compareObjects = (a, b) => {
return a.id === b.id && a.location === b.location;
}
该功能仅比较对象的相关属性。
如何使用此功能从阵列中删除重复项?
编辑:为澄清起见,我想使用一个函数来比较对象的某些属性,而不是整个对象。
答案 0 :(得分:0)
显而易见的解决方案是将每个元素与其他元素(除了自身)进行比较:
const result = array.filter((el, i) => !arr.some((el2, i2) => i < i2 && compareObjects(el, el2));
但是O(n²)对于大型数据集将变得非常慢,在这种情况下,哈希表可以帮助您:
const dupes = new Set;
const key = el => el.id + "|" + el.location;
const result = array.filter(it => !dupes.has(key(el)) && dupes.add(key(el)));
即O(n)(又名超快,但会占用更多内存)。
答案 1 :(得分:0)
您可以通过检查临时结果集的对象来缩小数组。
const
array = [{ name:'obj1', address: 987, id: '123', location: 'zyx' }, { name:'obj2', address: 654, id: '456', location: 'wvu' }, { name:'obj3', address: 321, id: '123', location: 'zyx' }],
compareObjects = (a, b) => a.id === b.id && a.location === b.location,
result = array.reduce((r, o) => {
if (!r.some(compareObjects.bind(null, o))) {
r.push(o);
}
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
您可以尝试以下功能
function unique(array , compareObjects){
array.sort(compareObjects);
for(var i = 1; i < array.length; ){
if( compareObjects(array[i-1], array[i]) === 0){
array.splice(i, 1);
} else {
i++;
}
}
return array;
}