[javascript入門] オブジェクト配列の中の重複データを見つける方法


オブジェクト配列とは「{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}

最後に

オブジェクト配列の重複データに対する処理は、結構頻繁に使われる可能性があるため、上記の方法を覚えておくと良いかと思います。

是非、お試しください。