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))
左側にしかない、両方にある、右側にしかないでオブジェクトを振り分けることができました。