JavaScript:オブジェクトの配列から重複を取り除く関数

JavaScript:オブジェクトの配列から重複を取り除く関数

配列の要素がプリミティブな値の場合、重複を取り除くには Set が便利です。

要素がオブジェクトの場合、Set ではなく Map を利用して重複を排除できます。

以下では Map を利用した重複排除の関数を例示します。

関数(TypeScript) #

TypeScript で記載しています。型定義があるのは引数部分のみですので、JavaScript として使いたい場合は引数部分の型を削除してください。

/** 指定されたキーを基準に重複を取り除いたオブジェクトの配列を返す。重複した場合は後に渡された要素が残る。 */
function deduplicateByKey<T extends object>(key: keyof T, ...args: T[]) {
  return Array.from(new Map(args.map((v) => [v[key], v])).values());
}

実行結果 #

const data1 = [
  { id: "111", name: "Alice" },
  { id: "222", name: "Bob" },
  { id: "333", name: "Charlie" },
];

const data2 = [
  { id: "111", name: "David" },
  { id: "222", name: "Eve" },
];

const data3 = [
  { id: "111", name: "Frank" },
  { id: "444", name: "Grace" },
];

const result = deduplicateByKey("id", ...data1, ...data2, ...data3);
// result
[
  {
    id: "111",
    name: "Frank",
  },
  {
    id: "222",
    name: "Eve",
  },
  {
    id: "333",
    name: "Charlie",
  },
  {
    id: "444",
    name: "Grace",
  },
];