• Как из одного массива объектов вычесть другой массив объектов?

    rockon404
    @rockon404
    Frontend Developer
    для примитивов:
    const arr1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
    const arr2 = ['b', 'd', 'f'];
    
    const result = arr1.filter(el => !arr2.includes(el));
    
    // результат ['a', 'c', 'e', 'g']


    для объектов по искомому ключу:
    const arr1 = [{name: 'Carl', age: 32}, {name: 'Sally', age: 24}];
    const arr2 = [{name: 'Carl', age: 32}];
    
    const result = arr1.filter(x => !arr2.some(y => x.name === y.name));
    
    // результат [{name: 'Sally', age: 24}]


    полное сравнение объектов:
    const compareObjects = (obj1, obj2) => {
        for (let p in obj1){
            if (Object.prototype.hasOwnProperty.call(obj1, p)) {
                if(obj1[p] !== obj2[p]){
                    return false;
                }
            }
        }
        for(let p in obj2){
            if (Object.prototype.hasOwnProperty.call(obj2, p)) {
                if (obj1[p] !== obj2[p]) {
                    return false;
                }
            }
        }
        return true;
    };
    
    const arr1 = [{name: 'Carl', age: 32}, {name: 'Sally', age: 24}];
    const arr2 = [{name: 'Carl', age: 32}];
    
    const result = arr1.filter(x => !arr2.some(y => compareObjects(x, y)));
    
    // результат [{name: 'Sally', age: 24}]

    пояснение почему Object.prototype.hasOwnProperty.call(obj, p), а не obj.hasOwnProperty(p).
    Так же можно использовать differesnce из lodash.
    Ответ написан
    6 комментариев