Diferença e interseção de duas matrizes contendo objetos

Eu tenho duas matrizeslist1 elist2 que possuem objetos com algumas propriedades;userId é o ID ou propriedade exclusiva:

list1 = [
    { userId: 1234, userName: 'XYZ'  }, 
    { userId: 1235, userName: 'ABC'  }, 
    { userId: 1236, userName: 'IJKL' },
    { userId: 1237, userName: 'WXYZ' }, 
    { userId: 1238, userName: 'LMNO' }
]

list2 = [
    { userId: 1235, userName: 'ABC'  },  
    { userId: 1236, userName: 'IJKL' },
    { userId: 1252, us,erName: 'AAAA' }
]

Estou procurando uma maneira fácil de executar as três operações a seguir:

list1 operation list2 deve retornar a interseção de elementos:

[
    { userId: 1235, userName: 'ABC'  },
    { userId: 1236, userName: 'IJKL' }
]

list1 operation list2 deve retornar a lista de todos os elementos delist1 que não ocorrem emlist2:

[
    { userId: 1234, userName: 'XYZ'  },
    { userId: 1237, userName: 'WXYZ' }, 
    { userId: 1238, userName: 'LMNO' }
]

list2 operation list1 deve retornar a lista de elementos delist2 que não ocorrem emlist1:

[
    { userId: 1252, userName: 'AAAA' }
]

questionAnswers(6)

yourAnswerToTheQuestion