オブジェクト配列とは「{name:value}」のようなjson形式のデータを配列化したものとなります。
今回は、シンプルにこのオブジェクト配列の重複データを見つける方法の備忘録となります。
重複オブジェクトを見つける方法は下記の2通りあります。
- オブジェクトをJSONデータとして直接比較する
- Key/Valueを使用して2つのオブジェクトを比較する
本投稿では、それぞれの方法をご紹介します。
オブジェクトをJSONデータとして直接比較する
この方法は2つの比較対象のオブジェクトをJSONデータに変換して比較します。
let objData1 = [
{
id: 1,
num: 23
}
,{
id: 1,
num: 23
}
,{
id: 2,
num: 30
}
,{
id: 2,
num: 20
}
];
// オブジェクト配列を
const data = Array.from(new Set(objData1.map(JSON.stringify))).map(JSON.parse);
console.log(data);
// [{id: 1, num: 23}, {id: 2, num: 30}, {id: 2, num: 20}] (3)
JSON同士の比較で重複でデータを取り除く場合は、他の要素が一つでも違うと重複としてみなされません。
本ケースでは完全一致の場合のみ対応が可能です。
Key/Valueを使用して2つのオブジェクトを比較する
どこかのKeyとValueが一致しているもののみ重複とみなす方法です。
下記のケースでは「id」と「num」の組み合わせの値が重複しているデータを見つけてオブジェクト配列を作り直します。
let objData = [
{
id: 1,
name: "name1",
description: "name1 is sample3.",
num: 23
}
,{
id: 1,
name: "name2",
description: "name2 is sample3.",
num: 23
}
,{
id: 2,
name: "name3",
description: "name3 is sample3.",
num: 30
}
,{
id: 2,
name: "name3",
description: "name3 is sample3.",
num: 20
}
];
// 重複データを比較し作り直し
function findDuplicateData(data, i){
let ans = [];
objData.forEach((key, index) =>{
if(i !== index && key.id === data.id && key.num === data.num){
ans.push(data);
objData.splice(i,1);
}
});
}
objData.forEach((key, index) => {
findDuplicateData(key, index);
});
// 重複データ
console.log(ans);
// 0 {id: 1, name: "name1", description: "name1 is sample3.", num: 23}
// 重複でーたを取り除いた後のデータ
console.log(objData);
// 0 {id: 1, name: "name2", description: "name2 is sample3.", num: 23}
// 1 {id: 2, name: "name3", description: "name3 is sample3.", num: 30}
// 2 {id: 2, name: "name3", description: "name3 is sample3.", num: 20}
最後に
オブジェクト配列の重複データに対する処理は、結構頻繁に使われる可能性があるため、上記の方法を覚えておくと良いかと思います。
是非、お試しください。