typescriptでこういうTagの型を定義していたとして、

type TagModel = {
  id: number,
  name: string
}

例えばこのような二つの配列が合った時に、idで比較して差分を取得する。

const testA: TagModel[] = [
  {id: 1, name: "test001"},
  {id: 2, name: "test002"},
  {id: 4, name: "test004"},
  {id: 7, name: "test007"},
  {id: 8, name: "test008"},
]

const testB: TagModel[] = [
  {id: 1, name: "test001"},
  {id: 2, name: "test002"},
  {id: 3, name: "test003"},
  {id: 5, name: "test005"},
  {id: 6, name: "test006"},
]

差分の比較結果はこんな感じで出力する。

type TagDiffResult = {
  left: TagModel[] // 左側にしかないTagModel
  same: TagModel[] // 両方にあるTagModel
  right: TagModel[] // 右側にしかないTagModel
}
{
  "left": [
    {"id": 4, "name": "test004"},
    {"id": 7, "name": "test007"},
    {"id": 8, "name": "test008"}
  ],
  "same": [
    {"id": 1, "name": "test001"},
    {"id": 2, "name": "test002"}
  ],
  "right": [
    {"id": 3, "name": "test003"},
    {"id": 5, "name": "test005"},
    {"id": 6, "name": "test006"}
  ]
} 

肝心な関数の中身はこちら(ソースコード全体像)

type TagModel = {
  id: number,
  name: string
}

type TagDiffResult = {
  left: TagModel[] // 左側にしかないTagModel
  same: TagModel[] // 両方にあるTagModel
  right: TagModel[] // 右側にしかないTagModel
}

const testA: TagModel[] = [
  {id: 1, name: "test001"},
  {id: 2, name: "test002"},
  {id: 4, name: "test004"},
  {id: 7, name: "test007"},
  {id: 8, name: "test008"},
]

const testB: TagModel[] = [
  {id: 1, name: "test001"},
  {id: 2, name: "test002"},
  {id: 3, name: "test003"},
  {id: 5, name: "test005"},
  {id: 6, name: "test006"},
]

/**
 * 引数の配列の差分を取得する
 */
function getTagDiff(tagsA: TagModel[], tagsB: TagModel[]): TagDiffResult {
  const same = tagsA.filter((_item) => {return tagsB.find((_item2) => _item2.id === _item.id)})
  const sameIds = same.map((_item) => _item.id)

  return {
    left: tagsA.filter((_item) => { return !sameIds.includes(_item.id) }),
    same: same,
    right: tagsB.filter((_item) => { return !sameIds.includes(_item.id) }),
  }
}

console.log(getTagDiff(testA, testB))

左側にしかない、両方にある、右側にしかないでオブジェクトを振り分けることができました。