配列から一意のオブジェクトを取得する


識別子として使用できる共通のプロパティが少なくとも 1 つあるオブジェクトの配列があるとします.

この関数を使用すると、選択したプロパティに基づいて一意のオブジェクトを持つ新しい配列を作成できます.

function getUniqueElementsFromArray(array, uniqueProperty) {
  const result = [];
  // The map will help us keep a record of the objects
  const map = new Map();
  array.forEach((item, i) => {
    if (!map.has(item[uniqueProperty])) {
      // New element, push it into results
      map.set(item[uniqueProperty], true); // you can set any value, we just need it to be in the Map
      // save unique object
      result.push(item);
      }
    });
  return result;
};


例:
配列があるとしましょう:

const sample = [
  {name: 'a', points: 20, game: 1},
  {name: 'e', points: 5, game: 3},
  {name: 'a', points: 15, game: 3},
  {name: 'i', points: 5, game: 3},
  {name: 'e', points: 50, game: 1},
  {name: 'a', points: 0, game: 5},
  {name: 'o', points: 100, game: 2},
  {name: 'e', points: 20, game: 2},
  {name: 'u', points: 20, game: 1},
  {name: 'i', points: 50, game: 2},
]


プロパティ 'name' を識別子として使用できます

console.log(getUniqueElementsFromArray(sample, 'name'))


結果は次のようになります.

[
  { name: 'a', points: 20, game: 1 },
  { name: 'e', points: 5, game: 3 },
  { name: 'i', points: 5, game: 3 },
  { name: 'o', points: 100, game: 2 },
  { name: 'u', points: 20, game: 1 }
]


ここに typescript バージョンを追加します.

export const getUniqueItems = (array: any[], uniqueProperty: string): any => {
  const result: any[] = []
  const map = new Map()
  array.forEach((item) => {
    if (!map.has(item[uniqueProperty])) {
      map.set(item[uniqueProperty], true)
      result.push(item)
    }
  })
  return result
}