JavaScriptでオブジェクト重複削除
JavaScriptでオブジェクトの配列から重複を削除する方法
問題
オブジェクトの配列があり、同じプロパティを持つオブジェクトをすべて削除したい。
解決策
Setオブジェクトを使用する
- Setオブジェクトは重複を許容しないため、配列の各要素をSetに追加することで重複を排除できます。
- Setから配列を作成することで、重複のない新しい配列を取得できます。
function removeDuplicates(arr) { const uniqueSet = new Set(arr.map(obj => JSON.stringify(obj))); return Array.from(uniqueSet, obj => JSON.parse(obj)); }
reduceメソッドを使用する
- reduceメソッドを使用して、配列をループしながら重複をチェックし、重複しないオブジェクトのみを新しい配列に追加します。
function removeDuplicates(arr) { return arr.reduce((acc, cur) => { if (!acc.some(obj => JSON.stringify(obj) === JSON.stringify(cur))) { acc.push(cur); } return acc; }, []); }
オブジェクトのキーを比較する
- オブジェクトのキーを比較して、重複を検出することもできます。ただし、キーが同じでも値が異なる場合は重複とみなされないことに注意してください。
function removeDuplicates(arr) { const seen = new Map(); return arr.filter(obj => { const key = JSON.stringify(obj); if (!seen.has(key)) { seen.set(key, true); return true; } return false; }); }
例
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' },
{ id: 3, name: 'Charlie' }
];
const uniqueArr = removeDuplicates(arr);
console.log(uniqueArr); // Output: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }]
問題と解決策
問題
JavaScriptの配列には、同じプロパティを持つオブジェクトが複数含まれている場合があります。これらの重複を削除したいという場面がよくあります。
解決策
いくつかの方法がありますが、ここでは代表的な3つの方法を解説します。
Setオブジェクトを利用する方法
function removeDuplicates(arr) {
// 各オブジェクトをJSON文字列に変換してSetに追加
const uniqueSet = new Set(arr.map(obj => JSON.stringify(obj)));
// Setから配列に戻す際、JSONをパースしてオブジェクトに戻す
return Array.from(uniqueSet, obj => JSON.parse(obj));
}
解説
- Array.from
Setから配列に戻し、JSON.parse()で再びオブジェクトに変換します。 - map
配列の各要素をJSON文字列に変換し、Setに追加します。JSON.stringify()を使うことで、オブジェクトを文字列として比較できるようになります。 - Setオブジェクト
重複を許容しないコレクションです。
メリット
- 効率が良い
- 簡潔で分かりやすい
function removeDuplicates(arr) {
return arr.reduce((acc, cur) => {
// 累積配列(acc)に同じオブジェクトがすでに存在しない場合、追加
if (!acc.some(obj => JSON.stringify(obj) === JSON.stringify(cur))) {
acc.push(cur);
}
return acc;
}, []);
}
- some
配列の要素に対して、ある条件を満たす要素が一つでもあればtrueを返します。ここでは、現在の要素(cur)と累積配列(acc)の各要素を比較し、同じオブジェクトが存在するか確認しています。 - reduce
配列の要素を一つずつ処理し、最終的に一つの値(新しい配列)を返すメソッドです。
- 他の処理と組み合わせやすい
- 柔軟性が高い
function removeDuplicates(arr) {
const seen = new Map();
return arr.filter(obj => {
const key = JSON.stringify(obj);
if (!seen.has(key)) {
seen.set(key, true);
return true;
}
return false;
});
}
- has
Mapにキーが存在するか確認します。 - JSON.stringify
オブジェクトを文字列に変換し、Mapのキーとして使用します。 - filter
配列の要素を一つずつ処理し、条件を満たす要素のみを新しい配列に格納します。 - Map
キーと値のペアを格納するコレクションです。
- キーベースの比較なので、特定のキーに基づいて重複を判断したい場合に有用
どの方法を選ぶかは、データの量、処理速度、コードの可読性など、様々な要因によって異なります。
- オブジェクトのキーを比較
特定のキーに基づいて重複を判断したい場合 - reduceメソッド
柔軟性が高い - Setオブジェクト
シンプルで高速
これらの方法を理解し、適切な方法を選択することで、JavaScriptのオブジェクト配列から重複を効率的に削除することができます。
- より複雑な重複判定が必要な場合は、カスタム比較関数を作成する必要があります。
- 上記のコードでは、オブジェクトをJSON文字列に変換して比較していますが、オブジェクトの構造が単純な場合は、直接プロパティを比較することも可能です。
const arr = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' },
{ id: 3, name: 'Charlie' }
];
const uniqueArr = removeDuplicates(arr);
console.log(uniqueArr);
ソートと比較による方法
原理
- ソートされた配列をループし、隣接する要素を比較して重複を検出する。
- 配列を特定のキーでソートする。
コード
function removeDuplicates(arr, key) {
arr.sort((a, b) => a[key] - b[key]);
const result = [];
let prev = null;
for (const obj of arr) {
if (prev === null || obj[key] !== prev[key]) {
result.push(obj);
}
prev = obj;
}
return result;
}
- ループで隣接する要素を比較し、キーが異なる場合は重複ではないため結果配列に追加する。
sort
メソッドで配列を指定したキーでソートする。
- ループで各オブジェクトをMapに追加し、すでに存在する場合は重複とみなす。
- MapオブジェクトにキーとしてオブジェクトのJSON文字列を、値としてオブジェクト自体を格納する。
function removeDuplicates(arr) {
const map = new Map();
for (const obj of arr) {
const key = JSON.stringify(obj);
if (!map.has(key)) {
map.set(key, obj);
}
}
return Array.from(map.values());
}
- 最終的にMapの値を配列に変換して返す。
function removeDuplicates(arr) {
return [...new Set(arr.map(obj => JSON.stringify(obj)))].map(str => JSON.parse(str));
}
- Setから配列に変換し、JSON文字列をパースしてオブジェクトに戻す。
Set
オブジェクトにオブジェクトのJSON文字列を直接追加する。
カスタム比較関数を利用する方法
- カスタム比較関数を使用して、オブジェクトの重複判定を行う。
function removeDuplicates(arr, compareFn) {
const result = [];
for (const obj of arr) {
if (!result.some(item => compareFn(item, obj))) {
result.push(obj);
}
}
return result;
}
- ループで各オブジェクトを比較し、重複がなければ結果配列に追加する。
javascript arrays object