【JavaScript】オブジェクト配列の重複をプロパティで削除する方法
JavaScriptでオブジェクトの配列を扱う際、特定のプロパティが重複している要素を取り除きたいケースはよくあります。本記事では、name プロパティの値が重複するオブジェクトを配列から除外する実装方法を解説します。
問題の概要
まず、次のようなオブジェクトの配列があるとします。
const arr = [
{name: "Jack", age: "14"},
{name: "bob", age: "14"},
{name: "sue", age: "21"},
{name: "Jill", age: "16"},
{name: "Jack", age: "21"}
];
この配列に対して、name の値が重複しているオブジェクトをすべて削除する関数を作成する必要があります。なお、最初に出現した要素は残し、2回目以降の出現のみを削除するものとします。
したがって、上記の配列に対して期待される出力結果は以下の通りです。
const arr = [
{name: "Jack", age: "14"},
{name: "bob", age: "14"},
{name: "sue", age: "21"},
{name: "Jill", age: "16"}
];
最後の {name: "Jack", age: "21"} は、name が「Jack」の要素がすでに存在するため削除されています。
実装コード例
以下は、hasOwnProperty() を使って出現済みの名前を管理し、重複要素をその場で削除(in-place)するコード例です。
const arr = [
{name: "Jack", age: "14"},
{name: "bob", age: "14"},
{name: "sue", age: "21"},
{name: "Jill", age: "16"},
{name: "Jack", age: "21"}
];
const removeDuplicate = arr => {
const appeared = {};
for(let i = 0; i < arr.length; ){
if(!appeared.hasOwnProperty(arr[i].name)){
appeared[arr[i].name] = 1;
i++;
continue;
};
arr.splice(i, 1);
};
};
removeDuplicate(arr);
console.log(arr);
コードのポイント
appearedオブジェクト: すでに確認したnameの値をキーとして記録し、重複判定に使用します。- ループ内での
i制御: 重複が見つかった場合はsplice(i, 1)で要素を削除し、インデックスを進めません。新規の名前の場合のみi++で次へ進みます。 - 元の配列を直接変更: この実装は元の配列自体を書き換えます。元の配列を保持したい場合は、事前にスプレッド構文などでコピーしておきましょう。
出力結果
このコードを実行すると、コンソールには次のように表示されます。
[
{ name: 'Jack', age: '14' },
{ name: 'bob', age: '14' },
{ name: 'sue', age: '21' },
{ name: 'Jill', age: '16' }
]
補足:より現代的な代替手段
上記の手法以外にも、Set や filter() を組み合わせることで、より簡潔に重複除去を実現できます。
const removeDuplicate = arr => {
const seen = new Set();
return arr.filter(item => {
if(seen.has(item.name)) return false;
seen.add(item.name);
return true;
});
};
console.log(removeDuplicate(arr));
こちらの方法では元の配列を変更せず、新しい配列を返すため、イミュータブルな処理を好む場合に適しています。用途やコードスタイルに応じて使い分けるとよいでしょう。
-
JavaScriptのundefinedプロパティとは?変数が未定義かどうかを判定する方法
JavaScriptにおけるundefinedは、変数が宣言されたもののまだ値が代入されていないこと、あるいは変数自体が宣言されていないことを示す特別な値です。undefinedプロパティを活用することで、ある変数に値が設定されているかどうかをプログラム上で簡単に判定できます。undefinedの基本的な挙動変数を宣言だけして値を代入しなかった場合、その変数には自動的にundefinedが格納されます。また、存在しないオブジェクトのプロパティへアクセスした場合や、戻り値を持たない関数の実行結果などもundefinedとなります。undefinedかどうかを厳密に比較する際は、等価演算子「===
-
JavaScriptで配列内オブジェクトのプロパティ名を置き換える方法
JavaScriptでオブジェクト配列のプロパティ名を置き換える方法 JavaScriptでは、map()メソッドを活用することで、配列に含まれる各オブジェクトのプロパティ名を別の名前に簡単に置き換えることができます。map()は元の配列を変更せずに新しい配列を生成するため、安全かつ効率的なデータ変換処理に適しています。 以下は、オブジェクト配列のプロパティ名 name を fullName に置き換えるサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta