Javascript:通过比较功能删除数组中的重复项

时间:2019-02-12 18:45:08

标签: javascript arrays

我有一个包含这样的对象的数组:

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;
}

该功能仅比较对象的相关属性。

如何使用此功能从阵列中删除重复项?

编辑:为澄清起见,我想使用一个函数来比较对象的某些属性,而不是整个对象。

3 个答案:

答案 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;
}